正则表达式匹配一个或两个数字

时间:2015-07-21 20:08:58

标签: c# regex

如果这个

(°[0-5])

匹配°4

和这个

((°[0-5][0-9]))

匹配°44

为什么会这样

((°[0-5])|(°[0-5][0-9]))

匹配°4但不是°44?

3 个答案:

答案 0 :(得分:3)

因为在正则表达式中使用逻辑OR时,正则表达式引擎在找到与正则表达式的第一部分(此处为°[0-5])匹配时返回第一个匹配项,并且在这种情况下,因为°[0-5]匹配{{ 1}}在°4中,它返回°44并且不会继续匹配其他情况(此处°4):

°[0-5][0-9]
  

A | B,其中A和B可以是任意RE,创建一个与A或B匹配的正则表达式。任意数量的RE可以由' |'分隔。通过这种方式。这也可以在组内使用(见下文)。 扫描目标字符串时,RE由' |'分隔。从左到右尝试。当一个模式完全匹配时,接受该分支。这意味着一旦A匹配,B将不会被进一步测试,即使它会产生更长的整体匹配。换句话说,' |'操作员从不贪心。要匹配文字' |',请使用\ |,或将其括在字符类中,如[|]。

答案 1 :(得分:1)

您在正则表达式替换中首先使用较短匹配。最好使用这个正则表达式匹配两个字符串:

°[0-5][0-9]?

RegEx Demo

答案 2 :(得分:1)

因为交替运算符|按指定顺序尝试替代选项并选择第一个成功匹配。除非正则表达式中的某些内容导致回溯,否则将永远不会尝试其他替代方案。例如,这个正则表达式

(a|ab|abc)
输入此输入时

abcdefghi

只会匹配a。但是,如果正则表达式更改为

(a|ab|abc)d

它将匹配a。然后,由于下一个characyer不是d,它会回溯并尝试下一个替代,匹配ab。由于下一个字符仍然不是d,它会再次回溯并匹配abc ...并且由于下一个字符为d,因此匹配成功。

为什么不从

中减少正则表达式
((°[0-5])|(°[0-5][0-9]))

到此?

°[0-5][0-9]?

它更简单易懂。