2017-01-11 21 views
0

我正在学习正则表达式。当我匹配此:正则表达式 - 为什么问号表现如此?

\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,03,15和20. 当我将问号移到方括号(\d?[^\w]\d)之前时,我的匹配与第一种情况相同。

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

+0

如果您没有意识到https://regex101.com会很好地解析和解释正则表达式。 –

+0

谢谢。我会检查出来 – shalvah

回答

2

因为?是一个贪婪的匹配。它会尝试尽可能多地消费。所以,如果\d存在,它会一直抓住它。

想想?最后定义了两个正则表达式:\d[^\w]\d\d[^\w]。在你的测试案例中,你从来没有匹配过第一个正则表达式不匹配,第二个正则表达式匹配(没有重叠,又是贪婪)。这就是为什么你的比赛从不改变。但是,如果你改变了你的测试用例来此:

30-01-2003 15:20/ 

取决于你是否不包括在正则表达式结束的问号,您会得到0/额外的匹配。

+0

'*'还贪婪? – shalvah

+0

是的。为了使所有格而不是贪婪,用'+'后缀它们。 '?+'或'* +'。 – nickb

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

+0

虽然你做了(有点)解释\ d +,但这不是问题所在。 – bartonjs

+0

我正在解释如何捕捉数字,如果您符合否定条件,那么当我试图帮助知识时,就会去激活它。 –

1

由于您正在搜索的特定字符串,您的第一个和第三个案例与原始案例的结果相同 - 它们通常不是等同的搜索。特别是,在你的字符串中出现的每个\d[^\w]恰好后面跟着一个数字,所以使尾随数字可选不会改变任何匹配。同样,每个出现的[^\w]\d恰好都以数字开头。如果您的字符串有两个空格在一起,或者在某处添加了双重标点符号,则结果会因每种情况而有所不同。

相关问题