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.
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/
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.
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.
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
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.
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.