【发布时间】:2011-04-26 23:28:30
【问题描述】:
我想使用 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”...但是如果字符串类似于“Book number V”,则此解决方案无效,因为我们将找不到匹配...
我试图通过使用贪婪量词 /VI{0,3}+/ 甚至 /VI*+/ 来强制捕获最大字符,但我仍然得到匹配“V”而不是“VII”
有什么想法吗?
【问题讨论】:
-
这在 Java 中肯定是贪婪的(在第 3 组中运行“VIII”会得到“VIII”,而不是“V”。同样测试正则表达式
"V?I{0,3}"也会得到贪婪的结果)。你确定你在 Groovy 中观察到这种行为吗? Groovy 使用不同的正则表达式引擎似乎有点令人惊讶。 -
嗯?那么,
?是 贪婪的,但{n,m}不是? -
也许不是完全在主题上,但正则表达式似乎被过度指定了。它将传递无效的罗马数字,因此不能用于错误检查。然而,它显然是一个 PITA。像
[MCDXLIV]+这样的东西怎么样? -
我只是在 Java 中运行它,结果是正确的。所以Java返回贪婪的结果。但 Groovy 没有。我正在使用 Groovy 控制台为 groovy 1.7.0 运行脚本,并且 {0,3} 并不贪婪。奇怪的是 {n,m} 是贪婪的,但仅当 n!=0 时。同样 .* 仅当匹配 0 个字符不符合模式时才会贪婪。
标签: java regex groovy match roman-numerals