0

私はGroovyコードから出てくるこの正規表現を持っています:

(?:[^\p{Alnum}äöü**~D~V~\~_**]|^)

(?:sometext|s\.t\.)

(?:[^\p{Alnum}äöü**~D~V~\~_**]|$$)

私が理解していない唯一のことはこの部分です:

**~D~V~\~_**

チルダはそこで何をしますか?それはエラーですか?それとも、キャラクタークラスのスイッチですか?

私の理解では、1行目と3行目は単語の境界に一致し、2行目は問題のテキスト(長い形式と短い形式)に一致します。

これをグーグルで検索してみました(もちろんここで検索しました)が、残念ながらタイルはgroovyの「matchthis」演算子に属しているため、ここで見つけたのは、何かを正規表現する方法に関する一般的な情報だけでした。

4

1 に答える 1

2

チルダは、groovy または Java の正規表現では特別な意味を持ちません。Groovy は正規表現の Java 解釈をまったく変更しません。のすべての特殊文字は、 の API リファレンス ページに一覧表示されていますjava.util.regex.Pattern

文字クラスとエスケープされたチルダを削除すると、特別に扱われていないこと\p{Alnum}がより簡単にわかります。~

assert ("D" ==~ "(?:[^äöü~D~V~_])") == false
assert ("V" ==~ "(?:[^äöü~D~V~_])") == false
assert ("~" ==~ "(?:[^äöü~D~V~_])") == false
assert (" " ==~ "(?:[^äöü~D~V~_])") == true

私はこれらの正規表現を捨てます。それらは明らかに間違っており、余分な文字で難読化されています。単語境界は一致する可能性が\bあり、\p{Alnum}äöüほぼ確実に\p{Alphabetic}\p{Digit}ユニコードを適切に処理する必要があります。

于 2012-07-12T15:46:04.457 に答える