我想使用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”匹配
有什么想法吗?
答案 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'
...这是因为空字符串不能满足模式。
希望这有助于其他人