2016-09-27 5 views
2

Ich habe den folgenden regulären Ausdruck für die Verwendung in einem Suchfeld entwickelt.
Das Ziel ist es, die Nutzung von bis zu 2 Worte übereinstimmen, dann das ganze Wort mit dem Buchstaben (n) und allem nach:Regex, um bis zu 2 vollständige Wörter und das nächste Wort mit dem Zeichen

/^ 
    .*?     # match anything before, as few times as possible 
    (
     (?: 
      [^\s]+\s* # anything followed by whitespace 
     ){1,2}   # match once or twice 
     \s*?   # match whitespaces that may be left behind, just in case 
     [^\s]*?   # match the beginning of the word, if exists 
    )? 
    (foo|bar)   # search term(s) 
    ([^\s]*\s*.*)  # whatever is after, with whitespace, if it is the end of the word 
$/xi 

Das Problem ist, dass es nicht immer richtig passen.
Einige Beispiele, wenn für "a" gesucht:

Fantastic drinks and amazing cakes 

Expected match: 
$1 = F 
$2 = a 
$3 = ntastic drinks and amazing cakes 

Result: 
$1 = Fantastic drinks (space) 
$2 = a 
$3 = nd amazing cakes 

----------------------------------------- 

Drinks and party! 

Expected match: 
$1 = Drinks (space) 
$2 = a 
$3 = nd party! 

Result: 
$1 = Drinks and p 
$2 = a 
$3 = rty! 

------------------------------------------ 

Drinks will be served at the caffetary in 5 minutes 

Expected match: 
$1 = be served (space) 
$2 = a 
$3 = t the caffetary in 5 minutes 

Result (matches correctly): 
$1 = be served (space) 
$2 = a 
$3 = t the caffetary in 5 minutes 

Sie mit ihm auf https://regex101.com/r/cI7gZ3/1 experimentieren mit Unit-Tests enthalten.

Die Art, dass dies nicht funktioniert, ist seltsam, beyound was ich beschreiben kann. Aber, meine Vermutung, ist, dass dies Übereinstimmungen vorzieht, die 1-2 Wörter haben vor der Suchbegriff.

Was denken Sie, dass das hier falsch sein könnte? Was denkst du, was diese Probleme verursacht?

+0

Was ist 'Ffffantastic'? Wie sollten Teile erfasst werden? – revo

+0

Wenn in der zweiten Erfassungsgruppe (ich bezeichne 'Suchbegriff') das in meinen Beispielen verwendete "a" ist, sollte 'Ffff' in der ersten Gruppe und' ntastic' auf der 3. Gruppe gespeichert werden. –

+0

Ich sehe, Sie haben die Antwort akzeptiert, aber eine Frage: haben Sie nur Buchstaben und Leerzeichen oder andere Zeichen können auch in Ihrem Eingabe-String sein? – revo

Antwort

1

Ich schlage vor, faul Versionen von \S+ und {1,2} in

(?: 
    \S+?\s* # anything followed by whitespace 
){1,2}? 

und entfernen Sie den [^\s]*? # match the beginning of the word, if exists Teil verwenden.

Siehe updated regex demo

^ 
    .*? # match anything before, as few times as possible 
    (
    (?: 
     \S*?\s* # anything followed by whitespace 
    ){1,2}? 
    \s* # just in case there's whitespace 
)? 
    (a) # search term(s) 
    (\S*\s*.*) # whatever is after, without whitespace if it is the end of the word 
$ 
+0

Es versagt für "Fantastische Getränke und erstaunliche Kuchen", passend zu "Fant" in der ersten Gruppe statt "F". –

+0

Ich habe aktualisiert, bitte erneut überprüfen. –

+1

Es funktioniert jetzt perfekt! Vielen Dank! –

Verwandte Themen