2

私は次のコードを持っています:

public class testMatch {

    public static void main(String[] args) {
        String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
        String expression = "3";
        if (dummyMessage.matches(expression)){
            System.out.println("MATCH!");
        } else {
            System.out.println("NO MATCH!");
        }

    }
}

dummyMessage には式 3 が含まれているため、これは一致すると予想されますが、このスニペットを実行すると、コードは NO MATCH! を出力します。

私は自分が間違っていることを理解していません。

OK、答えるのをやめましょう!.*3.* は動作します これは私がいくつかのライブ コードで抱えている問題を過度に単純化したものです。正規表現は構成可能であり、これまで文字列全体の一致は問題ありませんでしたが、文字列の一部を一致させる必要がありました。そして、なぜそれが機能しないのか疑問に思っていました。

4

11 に答える 11

9

文字列全体に対して一致します。つまり、^3$他のほとんどの正規表現の実装と同様です。そのため、eg または文字列3と一致しません。333しかし.*3.*、仕事をするでしょう。

ただし、文字列に「3」が含まれているかどうかをテストするだけの場合は、正規表現はまったく必要ありません。dummyMessage.contains(expression)代わりに使用してください。

于 2013-01-16T14:27:46.327 に答える
3

String#matches(regex)この文字列が指定された正規表現と一致するかどうかを示します。代わりにString.contains(charseq)が必要になる可能性があるため、dummyMessage が 3 であるかどうかを確認しようとするため、文字列の dummyMessage は式と一致しません。

 String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
            String expression = "3";
            if (dummyMessage.contains(expression)){
                System.out.println("MATCH!");
            } else {
                System.out.println("NO MATCH!");
            }
于 2013-01-16T14:27:55.447 に答える
2

そのような正規表現に一致します:.*3.*

于 2013-01-16T14:28:18.267 に答える
2

contains(expression)を使用する

 String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
        String expression = "3";
        if (dummyMessage.contains(expression)) {
            System.out.println("MATCH!");
        } else {
            System.out.println("NO MATCH!");
        }
于 2013-01-16T14:28:49.537 に答える
2

matchestrue を返すには、文字列全体を一致させる必要があります。たぶん使ってみてください.*3.*

于 2013-01-16T14:28:06.887 に答える
1

デフォルトでString#matches()は、文字列が正規表現と完全に一致するかどうかをテストします。それを機能させるには

expression = "3"

expression = ".*3.*"

文字列の部分文字列を一致させるには、Matcher#find()メソッドを使用します。

于 2013-01-16T14:28:45.167 に答える
1

あなたの正規表現はむしろ.*3.*

于 2013-01-16T14:29:00.613 に答える
1

あなたは探しているかもしれませんmatcher.find

String message = "asdfasdfsadfsadfasdf 3 sdfasdf3asdfasdf";
String expression = "3";

// Really only need to do this once.
Pattern pattern = Pattern.compile(expression);
// Do this once for each message.
Matcher matcher = pattern.matcher(message);
if (matcher.find()) {
  do { 
    System.out.println("MATCH! At " + matcher.start() + "-" + matcher.end());
  } while ( matcher.find() );
} else {
  System.out.println("NO MATCH!");
}
于 2013-01-16T14:39:08.783 に答える
1

String クラスの matches() メソッドは、文字列全体が一致するかどうかを確認します。コードを次のように変更しました。

public class testMatch
{

    public static void main(String[] args)
    {
        String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
        String expression = ".*3.*";
        if (dummyMessage.matches(expression))
        {
            System.out.println("MATCH!");
        }
        else
        {
            System.out.println("NO MATCH!");
        }

    }
}

そしてそれは今動作します

于 2013-01-16T14:33:25.477 に答える
0

それに応じて元の正規表現を変更します-現在は正しくなく、一致しません:

String expression = "(.*)3(.*)";

または、String.contains()を使用します-この状況には、これがはるかに適切だと思います。

于 2013-01-16T14:29:16.300 に答える
0

あなたはそのようにするか:

String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
String expression = "3";
Pattern p = Pattern.compile(".*3.*");
Matcher m = p.matcher(dummyMessage);
boolean b = m.matches();
if (b) {
    System.out.println("MATCH!");
}
else {
    System.out.println("NO MATCH!");
}

またはこの方法:

String dummyMessage = "asdfasdfsadfadfasdf 3 sdfasdfasdfasdf";
String expression = "3"
if (dummyMessage.contains(expression)) {
    System.out.println("MATCH!");
}
else {
    System.out.println("NO MATCH!");
}
于 2013-01-16T14:35:16.100 に答える