質問

1 つの部分文字列で始まり特定の部分文字列で終わらない文字列に一致する正規表現を探しています。

例:

// Updated to be correct, thanks @Apocalisp
^foo.*(?<!bar)$

「foo」で始まり「bar」で終わらないものと一致する必要があります。[^...] 構文については知っていますが、単一の文字ではなく文字列に対してそれを行うものは見つかりません。

私は特に Java の正規表現に対してこれを行おうとしていますが、以前にこれに遭遇したことがあるので、他の正規表現エンジンに対する答えも素晴らしいでしょう。

これが C# でも動作することを検証してくれた @Kibbee に感謝します。

役に立ちましたか?

解決

この場合、あなたは欲しいと思います 否定的な後読み, 、 そのようです:

foo.*(?<!bar)

他のヒント

以下を使用して@Apocalispの回答を確認しました。

import java.util.regex.Pattern;
public class Test {
  public static void main(String[] args) {
    Pattern p = Pattern.compile("^foo.*(?<!bar)$");
    System.out.println(p.matcher("foobar").matches());
    System.out.println(p.matcher("fooBLAHbar").matches());
    System.out.println(p.matcher("1foo").matches());
    System.out.println(p.matcher("fooBLAH-ar").matches());
    System.out.println(p.matcher("foo").matches());
    System.out.println(p.matcher("foobaz").matches());
  }
}

これにより、正しい答えが出力されます。

false
false
false
true
true
true

私は Java 正規表現には詳しくありませんが、 パターンクラス キャプチャしないゼロ幅の負の先読みに (?!X) を使用できることをお勧めします (後方参照としてキャプチャせずに、その位置で X ではないものを探します)。したがって、次のようにすることができます。

foo.*(?!bar) // not correct

アップデート:Apocalisp の言うとおり、否定的な後読みが必要です。(.* に一致するものが bar で終わらないことを確認しています)

他のコメント投稿者が言ったように、否定的な先読みが必要です。Java では、次のパターンを使用できます。

"^first_string(?!.?second_string)\\z"
  • ^ - 文字列がfirst_stringで始まることを保証します
  • \z - 文字列が Second_string で終わるようにします
  • (?!.?second_string) - first_string の後に Second_string を続けることはできないことを意味します
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top