webentwicklung-frage-antwort-db.com.de

Wie ignoriert man Whitespace in einer Betreffzeichenfolge eines regulären Ausdrucks?

Gibt es eine einfache Möglichkeit, den Leerraum in einer Zielzeichenfolge zu ignorieren, wenn nach Übereinstimmungen mit einem regulären Ausdrucksmuster gesucht wird? Wenn ich beispielsweise nach "Katzen" suche, möchte ich, dass "c ats" oder "ca ts" übereinstimmen. Ich kann den Whitespace nicht vorher entfernen, da ich den Anfangs- und Endindex des Matches (einschließlich aller Whitespaces) finden muss, um diesen Match hervorzuheben, und jeder Whitespace muss für Formatierungszwecke vorhanden sein. 

85
Steven

Sie können optionale Leerzeichen \s* zwischen jedes andere Zeichen in Ihrer Regex einfügen. Obwohl gewährt, wird es etwas langwieriger.

/cats/ -> /c\s*a\s*t\s*s/

97
Sam Dufel

An Steven's Kommentar zu Sam Dufels Antwort

Danke, das hört sich so an. Mir wurde jedoch gerade erst klar, dass ich nur die optionalen Whitespace-Zeichen haben möchte, wenn sie einem Newline folgen. So sollten zum Beispiel "c\n ats" oder "ca\n ts" übereinstimmen. Aber ich möchte nicht, dass "c ats" übereinstimmt, wenn es keine neue Zeile gibt. Irgendwelche Ideen, wie das gemacht werden könnte?

Das sollte den Trick tun:

/c(?:\n\s*)?a(?:\n\s*)?t(?:\n\s*)?s/

Siehe diese Seite für alle verschiedenen Variationen von "Katzen", auf die dies zutrifft.

Sie können dieses Problem auch mit conditionals lösen, sie werden jedoch nicht in der Javascript-Variante von Regex unterstützt.

6
Aurimas

Wenn Sie nur Leerzeichen zulassen möchten, dann

\bc *a *t *s\b

sollte es tun. Um auch Registerkarten zuzulassen, verwenden Sie

\bc[ \t]*a[ \t]*t[ \t]*s\b

Entfernen Sie die \b-Anker, wenn Sie auch cats in Wörtern wie bobcats oder catsup suchen möchten.

3
Tim Pietzcker

Sie könnten \s* zwischen jedes Zeichen in Ihrer Suchzeichenfolge setzen. Wenn Sie also nach einer Katze suchen, würden Sie c\s*a\s*t\s*s\s*s verwenden.

Es ist lang, aber Sie könnten die Saite natürlich dynamisch aufbauen.

Sie können es hier sehen: http://www.rubular.com/r/zzWwvppSpE

3
Kludge

Während die akzeptierte Antwort technisch korrekt ist, besteht ein praktischerer Ansatz nach Möglichkeit darin, Leerzeichen sowohl aus dem regulären Ausdruck als auch aus der Suchzeichenfolge zu entfernen.

Wenn Sie nach "Meine Katzen" suchen möchten, statt:

myString.match(/m\s*y\s*c\s*a\*st\s*s\s*/g)

Mach einfach:

myString.replace(/\s*/g,"").match(/mycats/g)

Warnung: Sie können dies für den regulären Ausdruck nicht automatisieren, indem Sie einfach alle Leerzeichen durch leere Zeichenfolgen ersetzen, da sie bei einer Negation auftreten oder Ihren regulären Ausdruck auf andere Weise ungültig machen könnten.

1
Konrad Höffner

Dieser Ansatz kann verwendet werden, um zu automatisieren this (Die folgende beispielhafte Lösung ist in Python, obwohl sie offensichtlich in jede Sprache portiert werden kann):

sie können den Whitespace vorher entfernen und die Positionen von Nicht-Whitespace-Zeichen speichern, um sie später verwenden zu können, um die übereinstimmenden String-Begrenzungspositionen in der ursprünglichen Zeichenfolge wie folgt zu ermitteln:

def regex_search_ignore_space(regex, string):
    no_spaces = ''
    char_positions = []

    for pos, char in enumerate(string):
        if re.match(r'\S', char):  # upper \S matches non-whitespace chars
            no_spaces += char
            char_positions.append(pos)

    match = re.search(regex, no_spaces)
    if not match:
        return match

    # match.start() and match.end() are indices of start and end
    # of the found string in the spaceless string
    # (as we have searched in it).
    start = char_positions[match.start()]  # in the original string
    end = char_positions[match.end()]  # in the original string
    matched_string = string[start:end]  # see

    # the match WITH spaces is returned.
    return matched_string

with_spaces = 'a li on and a cat'
print(regex_search_ignore_space('lion', with_spaces))
# prints 'li on'

Wenn Sie weiter gehen möchten, können Sie das Übereinstimmungsobjekt erstellen und stattdessen zurückgeben, sodass die Verwendung dieses Helpers praktischer ist.

Natürlich kann auch die Leistung dieser Funktion optimiert werden. Dieses Beispiel soll nur den Weg zu einer Lösung zeigen.

0
Bob