正则表达式
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]