开发工具与关键技术:MVC
作者:胡名权
撰写时间:2019年7月3日
我们已经提到怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定表达式(也叫做分组),然后你就可以指定这个表达式的重复次数了。
\b(\w+)\b\s+\1\b 可以用来匹配重复的单词,像 to to, button button.首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),然后是1个或几个空白符(\s+),最后是前面匹配的那个单词(\1)。
表4.分组语法
捕获
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释
(?#comment) 这种类型的组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
接下来的几个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^, $ 那样用于指定一个位置,这个位置应该满足一定的条件(断言),因为它们也被称为零宽断言。最好还是拿例子来说明吧:
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing.时,它会匹配sing和danc。
(?=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。
比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book 时,它匹配ading。
当正则表达式中包含能接受重复的限定符时,通常的行为是(使整个表达式能得到匹配的前提下)匹配尽可能多的字符串。如果用来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要贪婪匹配没也就是匹配尽可能少的字符串。前面给出的限定都可以被转化懒惰匹配模式,只要在它后面加上一个问号?。这样.?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:
a.?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab(为什么第一个匹配是aab而不是ab?简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配最有最大的优先权—The Match That Begins Earliest Wins).
表5.懒惰限定符
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
一些有用的C#正则表达式
“^\d+ " / / 非 负 整 数 ( 正 整 数 + 0 ) " [ 0 − 9 ] ∗ [ 1 − 9 ] [ 0 − 9 ] ∗ " //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]* "//非负整数(正整数+0)"[0−9]∗[1−9][0−9]∗” //正整数
“^((-\d+)|(0+)) " / / 非 正 整 数 ( 负 整 数 + 0 ) " − [ 0 − 9 ] ∗ [ 1 − 9 ] [ 0 − 9 ] ∗ " //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]* "//非正整数(负整数+0)"−[0−9]∗[1−9][0−9]∗”
//负整数 “^-?\d+KaTeX parse error: Expected group after '^' at position 14: " //整数 "^̲\d+(\.\d+)?” //非负浮点数(正浮点数 + 0)
“^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))KaTeX parse error: Expected 'EOF', got '\d' at position 16: " //正浮点数 "^((-\̲d̲+(\.\d+)?)|(0+(…” //非正浮点数(负浮点数 + 0)
“^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))KaTeX parse error: Expected 'EOF', got '\d' at position 16: " //负浮点数 "^(-?\̲d̲+)(\.\d+)?” //浮点数 “1+ " / / 由 26 个 英 文 字 母 组 成 的 字 符 串 " [ A − Z ] + " //由26个英文字母组成的字符串 "^[A-Z]+ "//由26个英文字母组成的字符串"[A−Z]+” //由26个英文字母的大写组成的字符串 “2+ " / / 由 26 个 英 文 字 母 的 小 写 组 成 的 字 符 串 " [ A − Z a − z 0 − 9 ] + " //由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+ "//由26个英文字母的小写组成的字符串"[A−Za−z0−9]+” //由数字和26个英文字母组成的字符串
“^\w+KaTeX parse error: Expected 'EOF', got '\w' at position 37: …者下划线组成的字符串 "^[\̲w̲-]+(\.[\w-]+)*@…” //email地址
“3+://(\w+(-\w+))(.(\w+(-\w+)))(?\S)? " / / u r l / ( d 2 ∣ d 4 ) − ( ( 0 ( [ 1 − 9 ] 1 ) ) ∣ ( 1 [ 1 ∣ 2 ] ) ) − ( ( [ 0 − 2 ] ( [ 1 − 9 ] 1 ) ) ∣ ( 3 [ 0 ∣ 1 ] ) ) " //url /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1])) "//url/(d2∣d4)−((0([1−9]1))∣(1[1∣2]))−(([0−2]([1−9]1))∣(3[0∣1]))/
// 年-月-日
/^((0([1-9]{1}))|(1[1|2]))/((0-2)|(3[0|1]))/(d{2}|d{4}) / / / 月 / 日 / 年 " ( [ w − . ] + ) @ ( ( [ [ 0 − 9 ] 1 , 3 . [ 0 − 9 ] 1 , 3 . [ 0 − 9 ] 1 , 3 . ) ∣ ( ( [ w − ] + . ) + ) ) ( [ a − z A − Z ] 2 , 4 ∣ [ 0 − 9 ] 1 , 3 ) ( ] ? ) / // 月/日/年 "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?) ///月/日/年"([w−.]+)@(([[0−9]1,3.[0−9]1,3.[0−9]1,3.)∣(([w−]+.)+))([a−zA−Z]2,4∣[0−9]1,3)(]?)”
//Emil “(d±)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?” //电话号码
"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])KaTeX parse error: Expected 'EOF', got '\d' at position 65: …(((1[6-9]|[2-9]\̲d̲)\d{2})-(0?[135…