RegexがString.matches()で機能しない


147

私はこの小さなコードを持っています

String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
    if(s.matches("[a-z]"))
    {
        System.out.println(s);
    }
}

印刷予定

dkoe

しかし、何も印刷されません!!


41
Java matchesは正規表現の最初に^を、最後に$を付けます。そのmatches("[a-z]")ため、実際には/ ^ [az] $ /を探します。
Robino

はい@Robinoあなたは絶対的に正しいです。
Mihir

1
確かに、のmatches出現を探す場合は[a-z]、それらすべてに一致する必要がありますか?私はmatchesすべての文字を正規表現に対して個別にチェックすることは期待していません。
PhilHibbs

@Robino:その機能はどこに記述/文書化されていますか?

@Toru String.MatchesのJavaドキュメントページ-他にどこにありますか?「java文字列がドキュメントを一致させる」というカジュアルなGoogleは、上位の結果で、「str.matches(regex)は式とまったく同じ結果をもたらす」というフレーズを明らかにしています。重要な言葉は「正確に」です。
ロビノ

回答:


323

Javaの誤った名前の.matches()メソッドへようこそ...すべての入力を照合します。残念ながら、他の言語も同様に続いてきました:(

正規表現が入力テキストと一致するかどうかを確認する場合は、a Pattern、a、Matcherおよび.find()マッチャーのメソッドを使用します。

Pattern p = Pattern.compile("[a-z]");
Matcher m = p.matcher(inputstring);
if (m.find())
    // match

入力に小文字しか含まれていないかどうかを確認したい場合は、を使用できますが.matches()、1つ以上の文字を照合する必要があります。の+ように、文字クラスにa を追加します[a-z]+。または^[a-z]+$およびを使用し.find()ます。


2
オンラインで数百の不完全なチュートリアルを見つけました。良いものを見つけることができませんでした。何か提案はありますか?
John

説明してくれてありがとう@fge .matches()この例.find()でなぜ動作が遅いのか知っていますか?
Konstantin Konopko 2013

3
他の言語がそれに倣ってどういう意味ですか?私が知っていることから、C ++だけが同等のメソッドのセットを持っています- regex_searchregex_match。Pythonではre.match、一致を文字列の先頭にのみアンカーし(まるでのように\Apattern)、Python 3.xには優れた.fullmatch()メソッドがあります。JS、Go、PHP、および.NETでは、暗黙的に一致をアンカーする正規表現メソッドはありません。ElasticSearch、XMLスキーマ、HTML5 /バリデーターAngluarパターンは、デフォルトで常にアンカーされています。Swift / Objective Cでは、オプションを使用して、最初にパターンを固定する方法があります。
WiktorStribiżew2017年

これを行うためのワンライナーの方法はありますか?
枢機卿-モニカを復活させる

44

[a-z]aとzの間の単一の文字に一致します。"d"たとえば、文字列がちょうどの場合、一致して出力されます。

[a-z]+1つ以上の文字と一致するように正規表現を変更する必要があります。


12
もちろん、これは単一の文字と一致します。それが正規表現が行うことです!ただし、はっきりしないのは(また、そうではないはずです!)、Javaがプレフィックス^とサフィックス$を提供された正規表現の周囲に配置し、不要に変更して、奇妙なバグを作成することです。それは最初の正規表現が意図していた方法ではないので、彼らはそれをすべきではありません。
klaar 2016年

28

String.matches部分文字列だけでなく、文字列全体が正規表現に一致するかどうかを返します。


3
本当に悲しい現実は、あなたが正しいということです。彼らがなぜこのようにそれをしたのか私は本当に知りません。
Hola Soy Edu Feliz Navidad

16

正規表現のJavaの実装は文字列全体と一致しようとします

これは、一致する部分を見つけようとするperl正規表現とは異なります

小文字のみの文字列を検索する場合は、パターンを使用します [a-z]+

少なくとも1つの小文字を含む文字列を検索する場合は、パターンを使用します .*[a-z].*




12

中古

String[] words = {"{apf","hum_","dkoe","12f"};
    for(String s:words)
    {
        if(s.matches("[a-z]+"))
        {
            System.out.println(s);
        }
    }

4

私は一度同じ問題に直面しました:

Pattern ptr = Pattern.compile("^[a-zA-Z][\\']?[a-zA-Z\\s]+$");

上記は失敗しました!

Pattern ptr = Pattern.compile("(^[a-zA-Z][\\']?[a-zA-Z\\s]+$)");

上記は(および内のパターンで機能しました)


2

正規表現[a-z]dkoe、長さ1のストリングにのみ一致するため、一致しません[a-z]+。のようなものを使用してください。


-1

少なくとも()一致するパターンにキャプチャを配置し、次のようにパターンを修正する必要があります。

String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
    if(s.matches("(^[a-z]+$)"))
    {
        System.out.println(s);
    }
}

ブラケットは何も変更しませんでした。
Touniouk

括弧なしの@Tounioukにmatchesは出力がありません。
MohsenB

-3

あなたはあなたのパターンを大文字小文字を区別しないようにすることができます:

Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.