专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » 正则表达式:JScript 和 VBScript 正则表达式 »正文

正则表达式:JScript 和 VBScript 正则表达式

来源: 发布时间:星期日, 2009年9月6日 浏览:2次 评论:0

正则表达式
如果原来没有使用过正则表达式那么可能对这个术语和概念会不太熟悉不过它们并不是您想象那么新奇
请回想下在硬盘上是如何查找文件您肯定会使用 ? 和 * 来帮助查找您正寻找文件? 匹配文件名中单个而 * 则匹配个或多个个如 'data?.dat' 模式可以找到下述文件:
data1.dat
data2.dat
datax.dat
dataN.dat
如果使用 * 代替 ? 则将扩大找到文件数量'data*.dat' 可以匹配下述所有文件名:
data.dat
data1.dat
data2.dat
data12.dat
datax.dat
dataXYZ.dat
尽管这种搜索文件思路方法肯定很有用但也十分有限? 和 * 通配符有限能力可以使你对正则表达式能做什么有个概念不过正则表达式功能更强大也更灵活
早期起源
正则表达式“祖先”可以直上溯至对人类神经系统如何工作早期研究Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出种数学方式来描述这些神经网络
1956 年, 位叫 Stephen Kleene 数学家在 McCulloch 和 Pitts 早期工作基础上发表了篇标题为“神经网事件表示法”论文引入了正则表达式概念正则表达式就是用来描述他称为“正则集代数”表达式因此采用“正则表达式”这个术语
随后发现可以将这工作应用于使用 Ken Thompson 计算搜索算法些早期研究Ken Thompson 是 Unix 主要发明人正则表达式个实用应用就是 Unix 中 qed 编辑器
如他们所说剩下就是众所周知历史了从那时起直至现在正则表达式都是基于文本编辑器和搜索工具中个重要部分
使用正则表达式
在典型搜索和替换操作中必须提供要查找确切文字这种技术对于静态文本中简单搜索和替换任务可能足够了但是由于它缺乏灵活性因此在搜索动态文本时就有困难了甚至是不可能
使用正则表达式就可以:
测试某个模式例如可以对个输入串进行测试看在该串是否存在个电话号码模式或个信用卡号码模式这称为数据有效性验证
替换文本可以在文档中使用个正则表达式来标识特定文字然后可以全部将其删除或者替换为别文字
根据模式匹配从串中提取个子可以用来在文本或输入字段中查找特定文字
例如如果需要搜索整个 web 站点来删除某些过时材料并替换某些HTML 格式化标记则可以使用正则表达式对每个文件进行测试看在该文件中是否存在所要查找材料或 HTML 格式化标记用这个思路方法就可以将受影响文件范围缩小到包含要删除或更改材料那些文件然后可以使用正则表达式来删除过时材料最后可以再次使用正则表达式来查找并替换那些需要替换标记
个介绍说明正则表达式非常有用举例是种其串处理能力还不为人所知语言VBScript 是 Visual Basic 个子集具有丰富串处理功能和 C 类似 Jscript 则没有这能力正则表达式给 JScript 串处理能力带来了明显改善不过可能还是在 VBScript 中使用正则表达式效率更高它允许在单个表达式中执行多个串操作

个正则表达式就是由普通(例如 a 到 z)以及特殊(称为元)组成文字模式该模式描述在查找文字主体时待匹配个或多个正则表达式作为个模板将某个模式和所搜索串进行匹配
这里有些可能会遇到正则表达式举例:
JScript VBScript 匹配
/^\[ \t]*$/ "^\[ \t]*$" 匹配个空白行
/\d{2}-\d{5}/ "\d{2}-\d{5}" 验证个ID 号码是否由个2位数字个连以及个5位数字组成
/<(.*)>.*<\/\1>/ "<(.*)>.*<\/\1>" 匹配个 HTML 标记

下表是元及其在正则表达式上下文中行为个完整列表:
描述
\ 将下标记为个特殊、或个原义、或个 向后引用、或个 8进制转义符例如'n' 匹配 "n"'\n' 匹配个换行符序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("
^ 匹配输入开始位置如果设置了 RegExp 对象 Multiline 属性^ 也匹配 '\n' 或 '\r' 的后位置
$ 匹配输入结束位置如果设置了RegExp 对象 Multiline 属性$ 也匹配 '\n' 或 '\r' 的前位置
* 匹配前面子表达式零次或多次例如zo* 能匹配 "z" 以及 "zoo"* 等价于{0,}
+ 匹配前面子表达式次或多次例如'zo+' 能匹配 "zo" 以及 "zoo"但不能匹配 "z"+ 等价于 {1,}
? 匹配前面子表达式零次或例如"do(es)?" 可以匹配 "do" 或 "does" 中"do" ? 等价于 {0,1}
{n} n 是个非负整数匹配确定 n 次例如'o{2}' 不能匹配 "Bob" 中 'o'但是能匹配 "food" 中两个 o
{n,} n 是个非负整数至少匹配n 次例如'o{2,}' 不能匹配 "Bob" 中 'o'但能匹配 "foooood" 中所有 o'o{1,}' 等价于 'o+''o{0,}' 则等价于 'o*'
{n,m} m 和 n 均为非负整数其中n <= m最少匹配 n 次且最多匹配 m 次例如"o{1,3}" 将匹配 "fooooood" 中前 3个 o'o{0,1}' 等价于 'o?'请注意在逗号和两个数的间不能有空格
? 当该紧跟在任何个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时匹配模式是非贪婪非贪婪模式尽可能少匹配所搜索而默认贪婪模式则尽可能多匹配所搜索例如对于串 "oooo"'o+?' 将匹配单个 "o"而 'o+' 将匹配所有 'o'
. 匹配除 "\n" 的外任何单个要匹配包括 '\n' 在内任何请使用象 '[.\n]' 模式
(pattern) 匹配 pattern 并获取这匹配所获取匹配可以从产生 Matches 集合得到
VBScript 中使用 SubMatches 集合在JScript 中则使用 $0…$9 属性要匹配圆括号请使用 '\(' 或 '\)'
(?:pattern) 匹配 pattern 但不获取匹配结果也就是说这是个非获取匹配不进行存储供以后使用这在使用 "或" (|) 来组合个模式各个部分是很有用例如 'industr(?:y|ies) 就是个比 'industry|industries' 更简略表达式
(?=pattern) 正向预查在任何匹配 pattern 串开始处匹配查找这是个非获取匹配也就是说该匹配不需要获取供以后使用例如'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中 "Windows" 但不能匹配 "Windows 3.1" 中 "Windows"预查不消耗也就是说个匹配发生后在最后次匹配的后立即开始下次匹配搜索而不是从包含预查的后开始
(?!pattern) 负向预查在任何不匹配 pattern 串开始处匹配查找这是个非获取匹配也就是说该匹配不需要获取供以后使用例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中 "Windows"但不能匹配 "Windows 2000" 中 "Windows"预查不消耗也就是说个匹配发生后在最后次匹配的后立即开始下次匹配搜索而不是从包含预查的后开始
x|y 匹配 x 或 y例如'z|food' 能匹配 "z" 或 "food"'(z|f)ood' 则匹配 "zood" 或 "food"
[xyz] 集合匹配所包含任意例如 '[abc]' 可以匹配 "plain" 中 'a'
[^xyz] 负值集合匹配未包含任意例如 '[^abc]' 可以匹配 "plain" 中'p'
[a-z] 范围匹配指定范围内任意例如'[a-z]' 可以匹配 'a' 到 'z' 范围内任意小写字母
[^a-z] 负值范围匹配任何不在指定范围内任意例如'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内任意
\b 匹配个单词边界也就是指单词和空格间位置例如 'er\b' 可以匹配"never" 中 'er'但不能匹配 "verb" 中 'er'
\B 匹配非单词边界'er\B' 能匹配 "verb" 中 'er'但不能匹配 "never" 中 'er'
\cx 匹配由 x 指明控制例如 \cM 匹配个 Control-M 或回车符x 值必须为 A-Z 或
a-z 的否则将 c 视为个原义 'c'
\d 匹配个数字等价于 [0-9]

\D 匹配个非数字等价于 [^0-9]
\f 匹配个换页符等价于 \x0c 和 \cL
\n 匹配个换行符等价于 \x0a 和 \cJ
\r 匹配个回车符等价于 \x0d 和 \cM
\s 匹配任何空白包括空格、制表符、换页符等等等价于 [ \f\n\r\t\v]
\S 匹配任何非空白等价于 [^ \f\n\r\t\v]
\t 匹配个制表符等价于 \x09 和 \cI
\v 匹配个垂直制表符等价于 \x0b 和 \cK
\w 匹配包括下划线任何单词等价于'[A-Za-z0-9_]'
\W 匹配任何非单词等价于 '[^A-Za-z0-9_]'
\xn 匹配 n其中 n 为十 6进制转义值十 6进制转义值必须为确定两个数字长例如'\x41' 匹配 "A"'\x041' 则等价于 '\x04' & "1"正则表达式中可以使用 ASCII 编码.
\num 匹配 num其中 num 是个正整数对所获取匹配引用例如'(.)\1' 匹配两个连续相同
\n 标识个 8进制转义值或个向后引用如果 \n 的前至少 n 个获取子表达式则 n 为向后引用否则如果 n 为 8进制数字 (0-7)则 n 为个 8进制转义值
\nm 标识个 8进制转义值或个向后引用如果 \nm 的前至少有 nm 个获得子表达式则 nm 为向后引用如果 \nm 的前至少有 n 个获取则 n 为个后跟文字 m 向后引用如果前面条件都不满足若 n 和 m 均为 8进制数字 (0-7)则 \nm 将匹配 8进制转义值 nm
\nml 如果 n 为 8进制数字 (0-3)且 m 和 l 均为 8进制数字 (0-7)则匹配 8进制转义值 nml
\un 匹配 n其中 n 是个用 4个十 6进制数字表示 Unicode 例如 \u00A9 匹配版权符号 (?)

建立正则表达式
构造正则表达式思路方法和创建数学表达式思路方法也就是用多种元和操作符将小表达式结合在起来创建更大表达式
可以通过在对分隔符的间放入表达式模式各种组件来构造个正则表达式对 JScript 而言分隔符为对正斜杠 (/) 例如:
/expression/
对 VBScript 而言则采用对引号 ("") 来确定正则表达式边界例如:
"expression"
在上面所示两个举例中正则表达式模式 (expression) 均存储在RegExp 对象Pattern 属性中
正则表达式组件可以是单个集合、范围、选择或者所有这些组件任意组合
优先级顺序
在构造正则表达式的后就可以象数学表达式样来求值也就是说可以从左至右并按照个优先级顺序来求值
下表从最高优先级到最低优先级列出各种正则表达式操作符优先级顺序:
操作符 描述
\ 转义符
, (?:), (?=), 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和顺序
| “或”操作

普通
普通由所有那些未显式指定为元打印和非打印组成这包括所有大写和小写字母所有数字所有标点符号以及些符号
最简单正则表达式是个单独普通可以匹配所搜索串中本身例如模式 'A' 可以匹配所搜索串中任何位置出现字母 'A'这里有些单正则表达式模式举例:
/a/
/7/
/M/
等价 VBScript 单正则表达式为:
"a"
"7"
"M"
可以将多个单组合在起得到个较大表达式例如下面 JScript 正则表达式不是别就是通过组合单表达式 'a'、'7'以及 'M' 所创建出来个表达式
/a7M/
等价 VBScript 表达式为:
"a7M"
请注意这里没有连接操作符所需要做就是将放在了另后面
特殊

有不少元在试图对其进行匹配时需要进行特殊处理要匹配这些特殊必须首先将这些转义也就是在前面使用个反斜杠 (\)下表给出了这些特殊及其含义:
特殊 介绍说明
$ 匹配输入结尾位置如果设置了 RegExp 对象 Multiline 属性则 $ 也匹配 '\n' 或 '\r'要匹配 $ 本身请使用 \$
( ) 标记个子表达式开始和结束位置子表达式可以获取供以后使用要匹配这些请使用 \( 和 \)
* 匹配前面子表达式零次或多次要匹配 * 请使用 \*
+ 匹配前面子表达式次或多次要匹配 + 请使用 \+
. 匹配除换行符 \n的外任何单要匹配 .请使用 \
[ 标记个中括号表达式开始要匹配 [请使用 \[
? 匹配前面子表达式零次或或指明个非贪婪限定符要匹配 ? 请使用 \?
\ 将下标记为或特殊、或原义、或向后引用、或 8进制转义符例如 'n' 匹配 'n''\n' 匹配换行符序列 '\\' 匹配 "\"而 '\(' 则匹配 "("
^ 匹配输入开始位置除非在方括号表达式中使用此时它表示不接受该集合要匹配
^ 本身请使用 \^
{ 标记限定符表达式开始要匹配 {请使用 \{
| 指明两项的间个选择要匹配 |请使用 \|

非打印
有不少很有用非打印偶尔必须使用下表显示了用来表示这些非打印转义序列:
含义
\cx 匹配由x指明控制例如 \cM 匹配个 Control-M 或回车符x 值必须为 A-Z 或 a-z 的否则将 c 视为个原义 'c'
\f 匹配个换页符等价于 \x0c 和 \cL
\n 匹配个换行符等价于 \x0a 和 \cJ
\r 匹配个回车符等价于 \x0d 和 \cM
\s 匹配任何空白包括空格、制表符、换页符等等等价于 [ \f\n\r\t\v]
\S 匹配任何非空白等价于 [^ \f\n\r\t\v]
\t 匹配个制表符等价于 \x09 和 \cI
\v 匹配个垂直制表符等价于 \x0b 和 \cK
匹配
句点 (.) 匹配串中任何单个打印或非打印除了换行符 (\n) 的外下面 JScript 正则表达式可以匹配 'aac'、'abc'、'acc'、'adc'如此等等同样也可以匹配 'a1c'、'a2c'、a-c'以及 a#c':
/a.c/
等价 VBScript 正则表达式为:
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: