使用正则表达式匹配多个匹配项或零(按此顺序)
我想用Groovy正则表达式来匹配罗马数字(我没有在Java中尝试过,但应该是相同的)。 我在这个网站上找到了一个答案,其中有人提出了以下正则表达式:
/M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})/
问题是在Groovy中像/V?I{0,3}/
这样的表达式不是贪婪的。 因此,对于像“书号VII”这样的字符串,匹配器/V?I{0,3}/
返回“V”而不是“VII”,因为它是所希望的。
显然,如果我们使用模式/VI+/
那么我们会得到匹配“VII”......但是如果字符串类似于“书号V”,这个解决方案是无效的,因为我们将得不到匹配...
我试图通过使用贪婪的量词/VI{0,3}+/
或甚至/VI*+/
来强制捕捉最大字符,但我仍然在“VII”上得到匹配“V”
有任何想法吗?
为什么不只是(IX | IV | V?I {1,3} | V)?
我发现我的错误是。 事情是,像/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'
...这是因为模式没有被空字符串满足。
希望这有助于他人
链接地址: http://www.djcxy.com/p/76929.html上一篇: Match several occurrences or zero (in this order) using regular expressions