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 では のような式が貪欲ではないことです。そのため、"Book number VII" のような文字列の場合、マッチャー/V?I{0,3}/は必要に応じて "VII" ではなく "V" を返します。

明らかに、パターンを使用する/VI+/と、一致する "VII" が得られます...しかし、文字列が "Book number V" のようなものである場合、一致するものが得られないため、この解決策は有効ではありません...

貪欲な量指定子を使用して最大の文字キャッチを強制しようとしましたが、/VI{0,3}+/それでも/VI*+/「VII」よりも「V」の方が一致します。

何か案は?

4

2 に答える 2

0

(IX|IV|V?I{1,3}|V) だけではないのはなぜですか?

于 2010-10-18T16:37:14.560 に答える
0

私は自分の間違いが何であるかを見つけました。問題は、EMPTY 文字列のようなパターン、/V?I{0,3}/または/V?I*/EMPTY 文字列によってさえ満たされるということです...したがって、「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/は 1 つの結果のみをスローするため、最初に一致した結果を選択しても問題ありません。

Result[0] --> 'VII'

...これは、パターンが空の文字列で満たされていないためです。

これが他の人に役立つことを願っています

于 2010-10-19T09:00:39.717 に答える