3

我想使用 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 中,like 表达式并不贪心。因此,对于像“Book number VII”这样的字符串,匹配器/V?I{0,3}/返回“V”而不是“VII”,因为它是期望的。

显然,如果我们使用该模式/VI+/,那么我们确实会得到匹配“VII”......但如果字符串类似于“Book number V”,则此解决方案无效,因为我们不会得到匹配......

我试图通过使用贪婪的量词来强制捕获最大字符,/VI{0,3}+//VI*+/我仍然得到匹配“V”而不是“VII”

有任何想法吗?

4

2 回答 2

0

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

于 2010-10-18T16:37:14.560 回答
0

我发现我的错误是什么。/V?I{0,3}/问题是,即使是 EMPTY 字符串,也可能会遇到类似的模式/V?I*/......所以对于像“Book VII”这样的字符串,匹配器将抛出以下结果匹配:

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

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

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

Result[0] --> 'VII'

...之所以如此,是因为空字符串不满足该模式。

希望这对其他人有帮助

于 2010-10-19T09:00:39.717 回答