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

我想用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

下一篇: How can I make my match non greedy in vim?