1

私はJavaで正規表現を使用しており、検索文字列を見つけるために次の式を書きました。

String regex = "(?i)[a-zA-Z0-9_.-|]*" + searchString + "(?i)[a-zA-Z0-9_.-|]*";

String「testEcho」と「testEcho-1」としてDBに2つ保存されています。

search として「test」を渡すStringと、上記の正規表現パターンは結果として「testEcho」のみを返します。ただし、両方の文字列を返す必要があります。私の正規表現の何が問題になっていますか?

4

3 に答える 3

2

文字クラスにエラーがあります:

[a-zA-Z0-9_.-|]

する必要があります

[a-zA-Z0-9_.|-]

それ以外の場合、-はリテラルとして扱われず、 と同様に(ASCII 46) と(ASCII 124)-の間の文字範囲を構築しようとします。.|A-Z

于 2013-09-18T17:35:32.143 に答える
1

-this のように をエスケープする必要があります[a-zA-Z0-9_.\-|]。そうしないと、 range と見なされ.-|て意味がありません。

(?i)また、最初の 1 つは最後まで続くため、2 倍にする必要はありません。
クラスをこれに短縮することもできます (しかし、それは問題ではありません) [\w.\-|]。クラスの先頭または末尾に を
配置して、範囲演算子の代わりにリテラルとして扱うこともできます。-

クエスチョン マークを追加することで、クラス量指定子を非貪欲にすることもできます*?

注意すべきもう 1 つのことは、searchString 自体です。各文字を
エスケープする必要があります。そうしないと、その文字の一部が正規表現のメタ文字として解釈される可能性があります。

推奨される正規表現:

String regex = "(?i)[\\w.|-]*?" + EscapedsearchString + "[\\w.|-]*?";

于 2013-09-18T17:46:55.440 に答える