正则表达式(二)

开发工具与关键技术: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+ &quot; / / 非 负 整 数 ( 正 整 数 + 0 ) &quot; [ 0 − 9 ] ∗ [ 1 − 9 ] [ 0 − 9 ] ∗ &quot; //非负整数(正整数 + 0) &quot;^[0-9]*[1-9][0-9]* "//+0"[09][19][09]” //正整数
“^((-\d+)|(0+)) &quot; / / 非 正 整 数 ( 负 整 数 + 0 ) &quot; − [ 0 − 9 ] ∗ [ 1 − 9 ] [ 0 − 9 ] ∗ &quot; //非正整数(负整数 + 0) &quot;^-[0-9]*[1-9][0-9]* "//+0"[09][19][09]
//负整数 “^-?\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+ &quot; / / 由 26 个 英 文 字 母 组 成 的 字 符 串 &quot; [ A − Z ] + &quot; //由26个英文字母组成的字符串 &quot;^[A-Z]+ "//26"[AZ]+” //由26个英文字母的大写组成的字符串 “2+ &quot; / / 由 26 个 英 文 字 母 的 小 写 组 成 的 字 符 串 &quot; [ A − Z a − z 0 − 9 ] + &quot; //由26个英文字母的小写组成的字符串 &quot;^[A-Za-z0-9]+ "//26"[AZaz09]+” //由数字和26个英文字母组成的字符串
“^\w+KaTeX parse error: Expected 'EOF', got '\w' at position 37: …者下划线组成的字符串 "^[\̲w̲-]+(\.[\w-]+)*@…” //email地址
3+://(\w+(-\w+))(.(\w+(-\w+)))(?\S)? &quot; / / u r l / ( d 2 ∣ d 4 ) − ( ( 0 ( [ 1 − 9 ] 1 ) ) ∣ ( 1 [ 1 ∣ 2 ] ) ) − ( ( [ 0 − 2 ] ( [ 1 − 9 ] 1 ) ) ∣ ( 3 [ 0 ∣ 1 ] ) ) &quot; //url /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1])) "//url/(d2d4)((0([19]1))(1[12]))(([02]([19]1))(3[01]))/
// 年-月-日
/^((0([1-9]{1}))|(1[1|2]))/((0-2)|(3[0|1]))/(d{2}|d{4}) / / / 月 / 日 / 年 &quot; ( [ w − . ] + ) @ ( ( [ [ 0 − 9 ] 1 , 3 . [ 0 − 9 ] 1 , 3 . [ 0 − 9 ] 1 , 3 . ) ∣ ( ( [ w − ] + . ) + ) ) ( [ a − z A − Z ] 2 , 4 ∣ [ 0 − 9 ] 1 , 3 ) ( ] ? ) / // 月/日/年 &quot;^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?) /////"([w.]+)@(([[09]1,3.[09]1,3.[09]1,3.)(([w]+.)+))([azAZ]2,4[09]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…


  1. A-Za-z ↩︎

  2. a-z ↩︎

  3. a-zA-z ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值