Frage

Ich suche nach einer Regex, die mit einer Zeichenfolge übereinstimmt, die mit einer Teilzeichenfolge beginnt und nicht mit einer bestimmten Teilzeichenfolge endet.

Beispiel:

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

Sollte mit allem übereinstimmen, was mit „foo“ beginnt und nicht mit „bar“ endet.Ich kenne die Syntax [^...], kann aber nichts finden, was dies für eine Zeichenfolge anstelle einzelner Zeichen ermöglicht.

Ich versuche dies speziell für Javas Regex zu tun, bin aber schon einmal darauf gestoßen, daher wären Antworten für andere Regex-Engines auch großartig.

Vielen Dank an @Kibbee für die Überprüfung, dass dies auch in C# funktioniert.

War es hilfreich?

Lösung

Ich denke, in diesem Fall möchten Sie negativer Rückblick, etwa so:

foo.*(?<!bar)

Andere Tipps

Verifizierte Antwort von @Apocalisp mit:

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());
  }
}

Dies gibt die richtigen Antworten aus:

false
false
false
true
true
true

Ich bin nicht mit Java-Regex vertraut, aber mit der Dokumentation dafür Musterklasse Ich würde vorschlagen, dass Sie (?!X) für einen nicht erfassenden negativen Lookahead mit der Breite Null verwenden könnten (es sucht nach etwas, das an dieser Position nicht X ist, ohne es als Rückreferenz zu erfassen).Sie könnten also Folgendes tun:

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

Aktualisieren:Apocalisp hat Recht, Sie wollen einen negativen Rückblick.(Sie überprüfen, ob das, was mit .* übereinstimmt, nicht mit „bar“ endet.)

Wie andere Kommentatoren sagten, brauchen Sie einen negativen Ausblick.In Java können Sie dieses Muster verwenden:

"^first_string(?!.?second_string)\\z"
  • ^ - stellt sicher, dass die String mit First_String beginnt
  • \z – stellt sicher, dass die Zeichenfolge mit „second_string“ endet
  • (?!.?zweite_Zeichenfolge) – bedeutet, dass auf die erste_Zeichenfolge keine zweite_Zeichenfolge folgen kann
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top