Meister der Regex: Wie man einen String findet, der mit einem Teil-String beginnt und mit einem anderen nicht endet

Regex (reguläre Ausdrücke) sind unglaublich leistungsstarke Werkzeuge zur Textverarbeitung und Mustererkennung. Egal, ob Sie ein erfahrener Entwickler oder ein Neuling sind, das Verständnis dafür, wie man die Möglichkeiten von Regex nutzt, kann Ihnen viel Zeit und Mühe sparen. In diesem Artikel konzentrieren wir uns auf ein spezifisches Problem: ein Regex-Muster zu erstellen, das einen String findet, der mit einem bestimmten Teil-String beginnt und nicht mit einem anderen endet.

Das Problem

Angenommen, Sie möchten Strings in Ihrer Anwendung validieren. Sie müssen sicherstellen, dass:

  • Der String muss mit einem bestimmten Teil-String beginnen, sagen wir "foo".
  • Der String darf nicht mit einem anderen Teil-String enden, beispielsweise "bar".

Zum Beispiel wären gültige Übereinstimmungen:

  • foo123
  • foolish
  • foo

Während ungültige Übereinstimmungen wie folgt aussehen würden:

  • foobar
  • foo bar

Das kann knifflig sein, insbesondere wenn Sie Regex in Java oder einer anderen Programmiersprache verwenden, die eine ähnliche Regex-Syntax hat.

Die Lösung

Um dies zu erreichen, können wir negative Lookbehind-Assertions in Regex verwenden. Lookbehinds ermöglichen es uns zu spezifizieren, dass ein bestimmtes Element (in unserem Fall das Ende des Strings) nicht auf dem vorgesehenen Teil-String folgen sollte.

Konstruktion des Regex-Musters

Für unser spezifisches Szenario können wir unser Regex-Muster wie folgt definieren:

foo.*(?<!bar)$

Aufschlüsselung des Musters

  • foo: Das Muster beginnt mit den Zeichen “foo”.
  • .*: Der Punkt . entspricht jedem Zeichen (ausgenommen einem Zeilenabschluss) und das Sternchen * bedeutet null oder mehr Vorkommen dieses Zeichens.
  • (?<!bar): Dies ist die negative Lookbehind-Assertion. Sie überprüft, dass der String nicht mit “bar” endet.
  • $: Dies stellt sicher, dass wir am Ende der Zeile oder des Strings sind.

Wichtige Punkte zum Merken

  • Negative Lookbehind: Diese Regex-Funktion ermöglicht es Ihnen, Bedingungen basierend darauf zu konfigurieren, was am Ende des Strings NICHT vorhanden ist.
  • Portabilität: Das bereitgestellte Regex-Muster funktioniert effektiv in Java und wurde auch in der Programmiersprache C# verifiziert.

Beispielverwendung in Java

So könnten Sie dieses Regex in einem Java-Programm verwenden:

import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String regex = "foo.*(?<!bar)$";
        String[] testStrings = { "foobar", "foo123", "foolish", "foo bar" };

        for (String testString : testStrings) {
            if (Pattern.matches(regex, testString)) {
                System.out.println(testString + " passt.");
            } else {
                System.out.println(testString + " passt nicht.");
            }
        }
    }
}

Fazit

Das Verständnis, wie man Regex manipuliert, um Strings basierend auf spezifischen Bedingungen zu finden, ermöglicht es Ihnen, effektivere Validierungen in Ihren Anwendungen zu implementieren. Durch den Einsatz von negativen Lookbehind können Sie sicherstellen, dass Ihre Strings die gewünschten Kriterien erfüllen, ohne durch unerwünschte Endungen behindert zu werden.

Lassen Sie Ihr Wissen über Regex Ihre Programmierpraktiken stärken, und Sie werden feststellen, dass Sie viele komplexe Problemlösungsaufgaben auf Ihrer Software-Entwicklungsreise vereinfachen.