2

文字列に「xyz」というフレーズが含まれているかどうかに基づいてブール値を返す必要があるCodingBat の問題の正規表現を作成しようとしていますが、ピリオドで始まる「xyz」はカウントされません。これまでに試みた正規表現は次のとおりです。

str.matches("(?<!\\.)xyz");
str.matches("[^\\.]xyz")

しかし、どちらも意図したとおりには機能しません。これを機能させるために誰かが私を正しい方向に導くことができれば、私は感謝します.

編集:誰かがテストを求めたので:

xyzThere("abcxyz") → true
xyzThere("abc.xyz") → false
xyzThere("xyz.abc") → true
xyzThere("abcxy") → false
xyzThere("xyz") → true
xyzThere("xy") → false
xyzThere("x") → false
xyzThere("") → false
xyzThere("abc.xyzxyz") → true
xyzThere("abc.xxyz") → true
xyzThere(".xyz") → false
xyzThere("12 .xyz") → false
xyzThere("12xyz") → true
xyzThere("1.xyz.xyz2.xyz") → false

4

1 に答える 1

3

matches文字列全体に対してテストします (暗黙的にパターンを追加^して$周囲に配置します)。簡単な修正は.*、パターンの最初と最後の両方に追加することです。それ以外の場合は、最初の試みが正しいものです。2 番目のものは文字列の先頭で失敗します。これは、非文字が 1 つ必要なため.です (ただし、文字が 1 つ必要です)。

public boolean xyzThere(String str) {
    return str.matches(".*(?<!\\.)xyz.*");
}

確かに、これはちょっとしたハックです。文字列の任意の部分に対して通常の正規表現テストを行うには、もう少し OOP を使用する必要があります。

public boolean xyzThere(String str) {
    return java.util.regex.Pattern.compile("(?<!\\.)xyz").matcher(str).find();
}

import( CodingBatでは使えなかったようです。)

于 2012-11-07T18:35:14.290 に答える