String.matches() 正規表現の異常: 隠された正規表現の落とし穴を明らかにする
Java プログラミングでは、String.matches() メソッドは次のようになります。正規表現に対して文字列を検証する直感的な方法。ただし、その動作は、特に他のプログラミング言語と比較した場合、混乱を招く可能性があります。
次のコード スニペットを考えてみましょう:
String[] words = {"{apf","hum_","dkoe","12f"}; for(String s:words) { if(s.matches("[a-z]")) { System.out.println(s); } }
このコードは、文字列 "dkoe" のみを出力することを目的としています。小文字のアルファベット文字のみが含まれます。しかし、驚くべきことに何も印刷されません。なぜそうなるのでしょうか?
問題の核心は String.matches() メソッドの性質にあります。他の言語の同様のメソッドとは異なり、matches() は入力文字列全体を指定された正規表現と照合しようとします。つまり、文字列全体がパターンに一致するかどうかがチェックされます。
正規表現 "[a-z]" は、単一の小文字のアルファベット文字のみに一致します。どの入力文字列にも小文字が 1 つしか含まれていないため、matches() メソッドはどの文字列とも一致する文字列を見つけることができません。
この問題を修正するには、次の 2 つのアプローチが可能です。
アプローチ 1: パターンとマッチャーの使用
Pattern p = Pattern.compile("[a-z]+"); Matcher m = p.matcher(inputString); if (m.find()) { // match found }
このアプローチではパターンを使用しますMatcher は、入力文字列内で最初に一致するものを検索します。正規表現 "[a-z] " は、1 つ以上の小文字のアルファベット文字と一致します。これは、望ましい動作です。
方法 2: 文字クラスに ' ' を追加する
文字列に小文字のみが含まれているかどうかを確認するなどの単純な場合は、正規表現を次のように変更できます。
if(s.matches("[a-z]+")) { // match found }
文字クラス "[a-z]" に ' ' を追加すると、正規表現は 1 つ以上の小文字のアルファベット文字と一致し、問題は効果的に解決されます。
String.matches() の独特な動作と、提供されている代替手段を利用することで、このよくある落とし穴を回避し、Java の正規表現に対して文字列を効果的に検証できます。
以上が\'[a-z]\' のような単純な正規表現を使用すると、Java の String.matches() メソッドが複数の小文字を含む文字列の一致に失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。