正则表达式

https://msdn.microsoft.com/zh-cn/library/az24scfc(v=vs.110).aspx

 

贪婪匹配:由外向里查找匹配,如:.*

惰性匹配:由前向后查找匹配,格式是在贪婪表达式的后面加上一个?,如:.*?

 

后向引用(捕获模式):

(?<name>pattern)...\k<name>,即\k<name>等于 (?<name>pattern) 匹配到的内容

等同于

(?'name'pattern)...\k'name',即\k'name'等于 (?'name'pattern) 匹配到的内容

 

\k<name> 也可以使用 \1 替换,1是其对应的组下标

(?'name'pattern) 能记录捕获标记,而 (?'-name'pattern)则是擦除捕获标记

 

替换模式:

原文本:1 2 3 4       匹配表达式: \d+

 

边界定位点
^|$|\b|\B

 

反向引用:

\num或\k<name>

 

(pattern) 结合 \1 使用,也可以这样 (?'name'pattern) 结合 \k'name' 使用

而 (?:pattern)的 \1 是不存在的,因为断言是零宽的,即非捕获。

 

例子:

(?<1>a)(?<1>\1b)*      注意这里的第二个 ?<1>,由于* 是执行0或多次,所以每执行一次,就会覆盖一次前面的?<1>

aababb

(?'d'5)(?(d)\w{3}|\w)

511152225333

(?'d'\d)(?(d)\w{3}|\w)

511162227333

\d(?([5])\w{3}|\w)

6a55a1152

\d(?(\d)\w{3}|\w)

6a55a1152

 

断言(零宽:非捕获,即不被记录在GROUP中)

放在后面的:
(?=pattern) 零宽正向先行断言
(?!pattern) 零宽负向先行断言

放在前面的:
(?<=pattern) 零宽正向后行断言
(?<!pattern) 零宽负向后行断言

 

如:匹配不以 字母 开头的txt文件名

^(?![a-z]).*?\.txt

abc.txt 是不被匹配的

 

如:匹配以 数字 开头的txt文件名

^(?=[0-9]).*?\.txt

1abc.txt 是被匹配的

 

如:匹配不是以 .\r\n 结束的行

(?<!\.)(?!^)\r\n

 

如:(?<=(?'a'abc))\w+ 和 (?<=(?'a'abc))\k'a' 

111abcabc222abcabc333

 

 

任意字符:

[\s\S]

 

匹配A,但不捕获到组:

(?:A)

 

存在于捕获组,但执行匹配失败:

(?(name)(?!))(?# (?!) 是 (?(name)yes|no中的yes)

 

嵌套:

\(([\s\S]*?(((?'kh'\()[\s\S]*?)+((?'-kh'\))[\s\S]*?)+)*(?(kh)(?!)))\)(?#允许内容包含括号,无意义)

\(([^\(]*?(((?'kh'\()[^\(]*?)+((?'-kh'\))[^\(]*?)+)*(?(kh)(?!)))\)(?#不允许内容包含左括号)

如:

(1(2(3(4(5(6(7xx1)2)3)(1xx1)2)3)

 

HTML标签:

<(?<HtmlTag>[\w]+)[^>]*?>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag>>(?<-Nested>)|.*?)*</\k<HtmlTag>>

 

中文:

[\u4e00-\u9fa5]

中文+符号:

[\u0391-\uFFE5]

 

posted @ 2012-02-04 16:30  Yu  阅读(257)  评论(0编辑  收藏  举报