正则表达式 - 为什么问号表现得像这样?

时间:2017-01-11 17:53:21

标签: regex

我正在学习正则表达式。当我匹配时:

\d[^\w]\d

在此

30-01-2003 15:20

我得到3场比赛:0-0,1-2,3,5和5:2。 当我尝试在正则表达式(\d[^\w]\d?)的末尾添加问号时,我的匹配不会改变。 当我将问号移到方括号(\d[^\w]?\d)之后,匹配现在为30,01,20,33,15和20。 当我将问号移到方括号(\d?[^\w]\d)之前时,我的匹配与第一种情况相同。

这是为什么?我知道?运算符将前面的字符标记为可选,所以我期望第二种情况下的行为,但不是第一种或第三种情况。

3 个答案:

答案 0 :(得分:2)

因为?是贪婪的匹配。它将尝试尽可能多地消费。因此,如果存在\d,它将始终抓住它。

将最后的?视为定义两个正则表达式:\d[^\w]\d\d[^\w]。在你的测试用例中,你永远不会匹配第一个正则表达式不匹配而第二个正则表达式匹配(没有重叠,再次,它是贪婪的)。这就是为什么你的比赛永远不会改变。但是,如果您将测试用例更改为:

30-01-2003 15:20/

根据您是否在正则表达式的末尾添加问号,您将获得0/的额外匹配。

答案 1 :(得分:1)

您的第一个和第三个案例只会因为您正在搜索的特定字符串产生与原始案例相同的结果 - 它们通常不等同于搜索。具体来说,字符串中每次出现\d[^\w]后都会出现一个数字,因此使尾随数字可选不会改变任何匹配。同样,[^\w]\d的每次出现都恰好以数字开头。如果你的字符串有两个空格,或者某处有一个加倍的标点符号,那么每种情况的结果会有所不同。

答案 2 :(得分:0)

你只需要它

- 两个解决方案 -

<强> 1。 REGEXP:

\d+ 

<强> 1。说明:

\d =>numbers
+ => 1 or more

<强> 2。 REGEXP

[0-9]+

<强> 2。说明

[0-9] <= Numbers
+ <= 1 or more

它将匹配所有数字(解决方案1或2)

原文:

30-01-2003 15:20

<强>结果:

30
01
2003
15
20

享受。

请参阅: https://regex101.com/r/xXaLgN/6