使用正则表达式匹配多个匹配项或零(按此顺序)

时间:2010-10-18 14:08:50

标签: java regex groovy match roman-numerals

我想使用Groovy正则表达式匹配罗马数字(我没有在Java中尝试过,但应该是相同的)。 我在这个网站上找到了一个答案,其中有人建议使用以下正则表达式:

/M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})/

问题是像/V?I{0,3}/这样的表达式在Groovy中并不贪婪。 因此,对于像“Book Number VII”这样的字符串,匹配器/V?I{0,3}/将返回“V”而不是“VII”。

显然,如果我们使用模式/VI+/,那么我们得到匹配“VII”......但是如果字符串类似于“书号V”,则此解决方案无效,因为我们将得不到匹配。 ..

我试图通过使用贪婪的量词/VI{0,3}+/甚至/VI*+/来强制捕获最大字符,但我仍然将“V”与“VII”匹配

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

为什么不呢(IX | IV | V?I {1,3} | V)?

答案 1 :(得分:0)

我发现了我的错误。 事情就是/V?I{0,3}//V?I*/等模式甚至被EMPTY字符串所满足......所以对于像“Book VII”这样的字符串,匹配器会抛出以下结果匹配:

Result[0] --> ''
Result[1] --> '' 
Result[2] --> ''
Result[3] --> '' 
Result[4] --> '' 
Result[5] --> 'VII'
Result[6] --> '' 

贪婪的结果就在那里(结果[5])好了。 我的问题是我总是选择第一个匹配(Result [0]),这只有在空字符串不满足模式时才有效。

例如,建议的模式/V?I{1,3}|V/只会抛出一个结果,因此选择第一个结果匹配是Ok:

Result[0] --> 'VII'

...这是因为空字符串不能满足模式。

希望这有助于其他人