2016-09-24 12 views
2

我想解决一个非常简单的问题,但我无法找到任何解决方案。 我的字符串看起来是这样的: “...0.0..0.0...正则表达式 - 一些匹配失踪

我的正则表达式是:0[.]{1,3}0

我期待3场比赛:0.0,0..0,0.0 但不是,我只获得了两场比赛:0.0和0.0。你能告诉我什么

回答

1

问题是,当正则表达式第一次匹配时,它会消耗它与之匹配的输入字符串中的字符。因此,在第一场比赛中,以匹配:

...0.0....0.0... 
    ^^^ 

这样的话,为下一场会考虑这是

....0.0... 

,并在那里,你可以看到字符串的其余部分,它不仅会找到一场比赛。

解决此问题的一个方法是使用零宽度超前断言,前提是您的正则表达式引擎支持该断言。所以,你的正则表达式看起来像

0[.]{1,3}(?=0) 

这样做的意义是,它将匹配0末,但它不会消耗它。这种方法的问题是它不会在匹配中包含0。此问题的一个解决方案是自行添加0

+0

谢谢,这是一个不错的和聪明的解决方法。我唯一需要做的是在匹配字符串的末尾附加“0”。你认为,这是唯一的解决方案吗? – patex1987

+0

我认为先行解决方案是最简单的方法(同样,假设您的正则表达式引擎支持)。 – redneb

+1

如果正则表达式引擎支持lookaheads,“更好”的解决方案是['(?=(0 \。{1,3} 0))'](https://regex101.com/r/bJ3gK5/1)所有的值将被捕获到组1中,并且不需要在末尾添加'0')。这比redneb的模式慢一点。 –