2011-01-04 2 views
76

Gibt es eine einfache Möglichkeit, den Leerraum in einer Zielzeichenfolge bei der Suche nach Übereinstimmungen mit einem regulären Ausdrucksmuster zu ignorieren? Wenn ich zum Beispiel nach "Katzen" suche, möchte ich, dass "c ats" oder "ca ts" übereinstimmen. Ich kann den Leerraum nicht vorher ausstreichen, da ich den Anfangs- und Endindex der Übereinstimmung (einschließlich beliebiger Leerzeichen) finden muss, um diese Übereinstimmung hervorzuheben, und alle Leerzeichen müssen zu Formatierungszwecken vorhanden sein.Wie ignoriert man Whitespace in einer Zeichenfolge für einen regulären Ausdruck?

Antwort

83

Sie können optionale Leerzeichen \s* zwischen alle anderen Zeichen in Ihrem Regex stecken. Obwohl es gewährt wird, wird es ein bisschen lang werden.

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

+0

Danke, klingt wie das ist der Weg zu gehen. Aber ich habe gerade gemerkt, dass ich nur die optionalen Whitespace-Zeichen möchte, wenn sie einem Zeilenumbruch folgen. So sollten zum Beispiel "c \ n ats" oder "ca \ n ts" übereinstimmen. Aber würde "c ats" nicht übereinstimmen wollen, wenn es keine neue Zeile gibt. Irgendwelche Ideen, wie das gemacht werden könnte? – Steven

2

Sie \s* in Ihrem Suchbegriff dazwischen jedes Zeichen setzen könnte also, wenn Sie für Katze gesucht haben würden Sie c\s*a\s*t\s*s\s*s

Es ist lange verwenden, aber man konnte die Zeichenfolge dynamisch natürlich bauen.

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

3

Wenn Sie nur Räume ermöglichen, dann

\bc *a *t *s\b 

es tun sollten. , Damit auch Tabs

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

Entfernen Sie die \b Anker verwenden, wenn Sie wollen auch cats innerhalb von Worten wie bobcats oder catsup zu finden.

6

Steven Kommentar zu Antwort Sam Dufel der

Danke, Adressierung klingt wie das ist der Weg zu gehen. Aber ich habe gerade gemerkt, dass ich nur die optionalen Whitespace-Zeichen möchte, wenn sie einem Zeilenumbruch folgen. So sollten zum Beispiel "c \ n ats" oder "ca \ n ts" übereinstimmen. Aber würde "c ats" nicht übereinstimmen wollen, wenn es keine neue Zeile gibt. Irgendwelche Ideen, wie das gemacht werden könnte?

Dies sollte den Trick:

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

Siehe this page für alle verschiedenen Variationen von 'Katzen', dass dieser übereinstimmt.

Sie können dies auch mit conditionals lösen, aber sie werden nicht in der JavaScript-Variante von Regex unterstützt.

+2

So sehr hässlich. Es muss einen besseren Weg geben. –

+0

Sie könnten es in JS-Syntax lesbarer machen (obwohl die Technik in anderen Sprachen funktionieren würde) mit: 'new RegExp ('cats'.split (' '). Join (' (?: \ N \ s *)? ')) ' – brianary

Verwandte Themen