【发布时间】:2015-08-16 00:46:55
【问题描述】:
这必须只匹配这些数字:110, 220, 330, 440, 550, 660, 770, 880, 990(不包括 000)。这个正则表达式(pcre)有更短的方法吗?
/^(1{2}|2{2}|3{2}|4{2}|5{2}|6{2}|7{2}|8{2}|9{2})0$/
【问题讨论】:
这必须只匹配这些数字:110, 220, 330, 440, 550, 660, 770, 880, 990(不包括 000)。这个正则表达式(pcre)有更短的方法吗?
/^(1{2}|2{2}|3{2}|4{2}|5{2}|6{2}|7{2}|8{2}|9{2})0$/
【问题讨论】:
这是一个应该可以工作的较短的正则表达式:
/^([1-9])\1[0]$/
它使用对第一个匹配字符的反向引用来匹配第二个。这确保了11、22、33 等模式。
这里是对 regex101 表达式中使用的字符的解释:
^在行首断言位置- 第一捕获组
([1-9])
[1-9]匹配 1 到 9 范围内的单个字符\1匹配第一个捕获组最近匹配的相同文本[0]匹配字符 0 字面意思$在行尾断言位置
你可以在这里测试它: https://regex101.com/r/oV6rE7/1
【讨论】:
0 并且它不会提高 imo 的可读性。
0而产生的歧义。没有捕获组的几种解决方法:regex101.com/r/hH5cZ5/1(版本 1、2、3)
你可以使用:
/\b([1-9])\g{1}0\b/
正则表达式的分解:
\b # word boundary
[1-9] # match digit 1-9 and group them as captured group #1
\g{1} # back-reference to group #1
0 # match 0
\b # word boundary
【讨论】:
\{1} => \g{1}