正则表达式的学习

表达式的(摘自msdn 

字符

/

将下一字符标记为特殊字符、文本、反向引用或八转义符。例如,“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”中的三个 o'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之

?

当此字符随任何其他限定符(*+?{n}{n,}{n,m})之后,匹配模式是心的心的模式匹配搜索到的、尽可能短的字符串,而默心的模式匹配搜索到的、尽可能的字符串。例如,在字符串“oooo”中,“o+?”只匹配“o”,而“o+”匹配所有“o”

.

匹配除“/n”之外的任何个字符。若要匹配包括“/n”在内的任意字符,使用“[/s/S]”的模式。

(pattern)

匹配 pattern 并捕获该匹配的子表达式。可以使用 $0...$9 属性从匹配集合中索捕的匹配。若要匹配括号字符 ( )使用“/(”或者“/)”

(?:pattern)

匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕匹配,不存供以后使用的匹配。这对于用字符 (|) 合模式部件的情况很有用。例如,与“industry|industries”相比,“industr(?:y| ies)”是一个更加经济的表达式。

(?=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 是一个十六转义码十六转义码正好是两位数。例如,“/x41”匹配“A”“/x041”“/x04”&“1”等效。在正表达式中使用 ASCII

/num

匹配 num,此 num 是一个正整数。到捕匹配的反向引用。例如,“(.)/1”匹配两个连续的相同字符。

/n

标识一个八转义码或反向引用。如果 /n 前面至少有 n 个捕子表达式,那 n 是反向引用。,如果 n 是八制数 (0-7),那 n 是八转义码

/nm

标识一个八转义码或反向引用。如果 /nm 前面至少有 nm 个捕子表达式,那 nm 是反向引用。如果 /nm 前面至少有 n 个捕,那 n 是反向引用,后面跟 m。如果前面的条件均不存在,那 n m 是八制数 (0-7) /nm 匹配八转义码 nm

/nml

n 是八制数 (0-3)m l 是八制数 (0-7) ,匹配八转义码 nml

/un

匹配 n,其中 n 是以四位十六制数表示的 Unicode 字符。例如,/u00A9 匹配版符号 (©)

 

元字符

元字符

.

匹配除行符以外的任意字符

/w

匹配字母或数字或下划线

/s

匹配任意的空白符

/d

匹配数字

/b

匹配单词始或

^

匹配字符串的

$

匹配字符串的

例子:
/ba/w*/b
匹配以字母a开头单词——先是某个单词开(/b),然后是字母a,然后是任意数量的字母或数字(/w*),最后是单词结(/b)

 

字符转义

特殊字符的转义需要用/

例子:www/.unibetter/.com匹配www.unibetter.comc://Windows匹配c:/Windows

 

表达重 

限定符

/

*

零次或更多次

+

一次或更多次

?

零次或一次

{n}

n

{n,}

n次或更多次

{n,m}

nm

例子:
Windows/d+
匹配Windows后面跟1个或更多数字
13/d{9}
匹配13后面跟9个数字(中国的手机号)
^/w+
匹配一行的第一个单词

 

字符

定一个范
例子:
[aeiou]
就匹配

 

相当于逻辑示是 |
需要注意的是,替候要注意先后序。/d{5}-/d{4}|/d{5}/d{5}|/d{5}-/d{4}果完全不一,匹配替换时,将会从左到右地测试每个分枝条件,如果足了某个分枝的,就不会去管其它的替条件
例子:
/(0/d{2}/)[- ]?/d{8}|0/d{2}[- ]?/d{8}
匹配3位区号的电话,其中区号可以用小括号括起来,也可以不用,区号与本地号可以用字号或空格隔,也可以没有
Windows98|Windows2000|WindosXP
是可以多个的任何一个英文元音字母
/(?0/d{2}[) -]?/d{8}
匹配几格式的电话

 

子表达式(分

,并且提供反向用。
例子:
字符
来描述一个正确的IP地址:

((2[0-4]/d|25[0-5]|[01]?/d/d?)/.){3}(2[0-4]/d|25[0-5]|[01]?/d/d?)

 

反向引用

表达式的最重要功能之一是存匹配的模式的一部分以供以后重新使用的能力。可以通使用非捕元字符 ?:?= ?! 来重写捕个捕的子匹配按照它在正表达式模式中从左到右出序存冲区号从 1 始,最多可存 99 个捕的子表达式。可以使用 /n 访问每冲区,其中 n 标识特定冲区的一位或两位十制数字。同可以特定的分命名。方法有尖括号和引号2(?'Word'/w+)  (?<Word>/w+)
例子:
(/w+)/s/1
文字中的重复错词Is is the cost of of gasoline going up up?

(?<=<(/w+)>).*(?=<///1>)匹配不包含属性的简单HTML标签内里的内容

组语

(exp)

匹配exp,并捕文本到自命名的

(?<name>exp)

匹配exp,并捕文本到名称name里,也可以写成(?'name'exp)

(?:exp)

匹配exp,不捕匹配的文本,也不此分分配

位置指定

(?=exp)

匹配exp前面的位置

(?<=exp)

匹配exp后面的位置

(?!exp)

匹配后面跟的不是exp的位置

(?<!exp)

匹配前面不是exp的位置

(?#comment)

这种类型的表达式的生任何影响,用于提供注释让阅读

 

断言&向零断言

(?=exp)度正预测先行断言,它断言自身出的位置的后面能匹配表达式exp
(?<=exp)
度正回断言,它断言自身出的位置的前面能匹配表达式exp
(?!exp)
负预测先行断言,断言此位置的后面不能匹配表达式exp
(?<!exp)
度正回断言,断言此位置的前面不能匹配表达式exp
例子:
/b/w+(?=ing/b)
,匹配ing尾的单词的前面部分(除了ing以外的部分),如I'm singing while you're dancing.,它会匹配singdanc
(?<=/bre)/w+/b
会匹配re开头单词的后半部分(除了re以外的部分),例如在reading a book,它匹配ading
/b/w*q[^u]/w*/b
匹配包含后面不是字母u的字母q单词(不完整)。但是如果多做测试(或者你思,直接就察出来了),你会发现,如果q单词尾的,像Iraq,Benq个表达式就会出
/
b/w*q(?!u)/w*/b可以解决问题

小括号的另一用途是能过语(?#comment)来包含注。例如:

2[0-4]/d(?#200-249)|25[0-5](?#250-255)|[01]?/d/d?(?#0-199)
一般,各个言的正表达式都有忽略模式里的空白符选项
于是,表达式就可以写成如下格式:
      (?<=
    # 断言要匹配的文本的前
      <(/w+)>
# 找尖括号括起来的字母或数字(HTML/XML标签)
      )              
# 缀结
      .*              # 匹配任意文本
      (?=     # 断言要匹配的文本的后
      <///1> 
# 找尖括号括起来的内容:前面是一个"/",后面是先前捕标签
      )              
# 缀结

 

婪和惰的感念

正常表达式的默婪模式的,比如a.*b,它将会匹配最的以a始,以b束的字符串。如果用它来搜索aabab,它会匹配整个字符串aabab
惰匹配,也就是匹配尽可能少的字符。a.*?b匹配最短的,以a始,以b束的字符串。如果把它用于aabab,它会匹配aab

惰限定符

*?

任意次,但尽可能少重

+?

1次或更多次,但尽可能少重

??

0次或1次,但尽可能少重

{n,m}?

nm次,但尽可能少重

{n,}?

n次以上,但尽可能少重

 

的正表达式的选项

选项

名称

IgnoreCase(忽略大小写)

匹配不区分大小写。

Multiline(多行模式)

更改^$的含,使它在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头尾匹配。

Singleline(行模式)

更改.的含,使它与一个字符匹配(包括行符/n)。

IgnorePatternWhitespace(忽略空白)

忽略表达式中的非转义空白并启用由#标记的注

RightToLeft(从右向左)

匹配从右向左而不是从左向右行。

ExplicitCapture(式捕)

已被式命名的

ECMAScript(JavaScript兼容模式)

使表达式的行与它在JavaScript里的行一致。

 

平衡/递归匹配

注意:里介的平衡组语法是由.Net Framework支持的;其它言/不一定支持这种功能,或者支持此功能但需要使用不同的法。

需要匹配像( 100 * ( 50 + 15 ) )这样的可嵌套的次性构,这时简单地使用/(.+/)只会匹配到最左的左括号和最右的右括号之的内容(里我们讨论的是婪模式,惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出的次数不相等,比如( 5 / ( 3 + 2 ) ) ),那我的匹配果里两者的个数也不会相等。有没有法在这样的字符串里匹配到最的,配的括号之的内容呢?

了避免(/(把你的大脑彻底搞糊涂,我们还是用尖括号代替括号吧。在我问题变成了如何把xx <aa <bbb> <bbb> aa> yy这样的字符串里,最的配的尖括号内的内容捕出来。

里需要用到以下的法构造:

(?'group') 把捕的内容命名group,入堆

(?'-group') 从堆出最后入堆的名group的捕内容,如果堆本来空,本分的匹配失

(?(group)yes|no) 如果堆上存在以名group的捕内容的继续匹配yes部分的表达式,否则继续匹配no部分

(?!) 宽负向先行断言,由于没有后表达式,试图匹配是失

如果你不是一个程序(或者你是一个的概念不熟的程序),你就这样理解上面的三种语法吧:第一个就是在黑板上写一个 "group",第二个就是从黑板上擦掉一个"group",第三个就是看黑板上写的有没有"group",如果有就继续匹配yes部分,否就匹配 no部分。

需要做的是碰到了左括号,就在黑板上写一个"group"碰到一个右括号,就擦掉一个,到了最后就看看黑板上有没有--如果有那就明左括号比右括号多,那匹配就应该

<                     #最外的左括号

[^<>]*                        #最外的左括号后面的不是括号的内容

( ( (?'Open'<)                #碰到了左括号,在黑板上写一个"Open"

[^<>]*                        #匹配左括号后面的不是括号的内容

)+ ( (?'-Open'>)              #碰到了右括号,擦掉一个"Open"

[^<>]*                        #匹配右括号后面不是括号的内容

)+ )* (?(Open)(?!))   #在遇到最外的右括号前面,判断黑板上有没有没擦掉的"Open";如果有,匹配失

>                     #最外的右括号

平衡的一个最常用就是匹配HTML,下面个例子可以匹配嵌套的<div>标签<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>.

 

参考:

微软msdn正则表达式说明(js版)

正则表达式30分钟教程

regular-expressions教程

Wes' Puzzling关于平衡组的论述

MTracer

这是一个非常好用的正则表达式测试和生成的工具,貌似是需要注册的,目前我还没有碰到到期的情况,不过,由于他就只是一个exe程序,我查找了注册表,发现一个字段可能跟破解有关,希望后来的使用,如果到期了,可以靠修改这个字段无限次的使用。

HKU/S-1-5-21-1993962763-682003330-839522115-500/Software/RegExLab.com/Regexp Match Tracer/Licence/RunTimes

 

关于正则表达式的应用

js中的应用可以去jsapi查询RegExp对象。

java中的应用可以去java api查询Matcher对象。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值