9

これを含むコードを変更する必要があります。

string.indexOf("bc")

文字「a」が前に付いている場合に「bc」の出現をスキップするソリューションによって、これをどのように変更できますか。

私はこれらを見つけたくありません:

abc

だけ:

xbc

ここで、xは(空でも)以外の何でもかまいません。

インデックスi-1==aかどうかをチェックする条件を設定し、trueの場合はindexOfメソッドを再度呼び出すことができると思います。しかし、それが非常に美しいコードになるとは思いません。

正規表現を使用するソリューションはどのようになりますか?

編集:いくつかの応答を見た後のヒント。正規表現だけでなく、インデックスを見つけるために必要なAPI呼び出しも取得すると便利です。

4

4 に答える 4

19

要求に応じて、より完全なソリューション:

    /** @return index of pattern in s or -1, if not found */
public static int indexOf(Pattern pattern, String s) {
    Matcher matcher = pattern.matcher(s);
    return matcher.find() ? matcher.start() : -1;
}

電話:

int index = indexOf(Pattern.compile("(?<!a)bc"), "abc xbc");
于 2012-06-26T19:39:11.373 に答える
5

ネガティブルックビハインドで正規表現を使用できます:

(?<!a)bc

残念ながら.indexOf、Javaで正規表現を使用して再現することはまだ混乱しています。

Pattern pattern = Pattern.compile("(?!a)bc");
Matcher matcher = pattern.matcher("abc xbc");
if (matcher.find()) {
    return matcher.start();
}
于 2012-06-26T19:05:58.003 に答える
1

正規表現を使用して条件に一致する文字列を見つけ、次にその文字列のインデックスを見つけます。

int index = -1;
Pattern p = Pattern.compile("[^Aa]?bc");
Matcher m = p.matcher(string);
if (m.find()) {
    index = m.start();
}

このようなもの。ここで、「string」は検索しているテキストであり、「index」は見つかった文字列の場所を保持します。(インデックスが見つからない場合、インデックスは-1になります。)また、フラグを設定しない限り、パターンでは大文字と小文字が区別されることに注意してください。

于 2012-06-26T19:10:09.947 に答える
1

Arneの答えに追加するには、インデックスも追加したい場合は、次のようにします。

public static int indexOf(String regex, String s, int index)
{
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(s);
    return matcher.find(index) ? matcher.start() : -1;
}

電話:

int index = indexOf("(?<!a)bc", "abc xbc", 2);
于 2017-11-01T11:39:42.217 に答える