16

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

例:

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

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

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

これがC#でも機能することを確認してくれた@Kibbeeに感謝します。

4

4 に答える 4

9

この場合、次のように否定的な後読みが必要だと思います。

foo.*(?<!bar)
于 2008-09-04T01:37:42.200 に答える
1

私はJava正規表現に精通していませんが、パターンクラスのドキュメントでは、キャプチャしないゼロ幅の負の先読みに (?!X) を使用できることが示唆されています(キャプチャせずに、その位置でXではないものを探します)後方参照として)。したがって、次のことができます。

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

更新: Apocalisp の右、負の後読みが必要です。(.* の一致が bar で終わらないことを確認しています)

于 2008-09-04T01:33:11.163 に答える
1

以下を使用して@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
于 2008-09-04T01:46:20.790 に答える
0

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

"^first_string(?!.?second_string)\\z"
  • ^ - 文字列が first_string で始まることを保証します
  • \z - 文字列が second_string で終わるようにします
  • (?!.?second_string) - first_string の後に second_string を続けることはできないことを意味します
于 2008-09-04T01:37:19.470 に答える