3

文字列に等号が含まれているかどうかを確認する必要があります。RegexPalが一致していても、私の現在の正規表現は Java 内では機能しないようです。

私の現在のコードは次のとおりです。

String str = "test=tests";
System.out.println(str + " - " + str.matches("[^=]=[^=]"));

次のテスト ケースでは、最初のテスト ケースは一致する必要がありますが、2 番目のテスト ケースは一致しません。

test=tests // matches t=t
test==tests // doesn't match

Regex Pal は正しく動作しますが、何らかの理由で Java は両方のテスト ケースで false を返します。私はどこか間違っていますか?

ありがとう!

4

4 に答える 4

6

Java のString.matches関数は、文字列の一部ではなく、文字列全体に一致します。つまり、 regex とほぼ同等^[^=]=[^=]$であるため、どちらも false を返します。あなたのものと同等の正規表現を構築するには、次を使用する必要があります。

str.matches("(?s).*[^=]=[^=].*")

(は がすべてに一致(?s)することを保証し.ます。)

または、 Patternを構築し、Matcherを使用して柔軟性を高めることもできます。これは String.matches が使用するものです。

final Pattern p = Pattern.compile("[^=]=[^=]");
final Matcher m = p.matcher(str);
return m.find();
于 2012-11-25T19:11:11.377 に答える
1

問題は、 String.matches()が一致する subsequence を検索せず、代わりに完全な文字列をパターンと照合しようとすることです。

あなたの目的のために、Matcher.find() が必要です: http://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html#find ()

于 2012-11-25T19:15:07.100 に答える
1

*または のいずれか+を正規表現に追加する必要があります。

str.matches("[^=]+=[^=]+")

string.matches()はデフォルトで固定されているため、これが必要です。^[^=]+=[^=]+$これは、文字列の一部だけでなく、文字列全体と一致する必要があることと同等であり、それを意味します。

于 2012-11-25T19:07:58.350 に答える
1

single前後の文字を一致させているだけ=です。これで、文字列を指定String#matchesされた と一致させようとするため、その中に完全な文字列が含まれていることを確認する必要があります。明らかに、文字列にはbefore と afterが含まれています。completePatternmany characters=

したがって、これを指定するには、ここで , を使用する必要がありquantifierます: -

  • +one or more文字を合わせる
  • *zero or more文字を合わせる

したがって、正規表現を次のように変更する必要があります: -

System.out.println(str + " - " + str.matches("[^=]+=[^=]+"))
于 2012-11-25T19:08:38.537 に答える