2017-03-21 1 views
1

Ich habe auf einen Eckfall getroffen - oder es ist so einfach, niemand hat jemals gefragt!RegEx entspricht dem ersten Vorkommen eines Wortes, aus einer Liste der gewünschten Wörter

Ich habe eine Liste der gewünschten Wörter, die ich in einem Block des Textes übereinstimmen möchte. Allerdings möchte ich nur das erste Vorkommen von jeweils von diesen übereinstimmen, (bearbeiten: , wenn sie im Zielblock vorhanden sind).

Wenn mein Textblock lautet:

glass shoes door doors window door glasses. glass's glass window windows glasses 

würde ich passen mag:

glass door window 

ich lerne, wie man es verengen, wie ich versuche, die Gruppierungen zu verstehen .. Dies ist:

/(?: [\ S] | ^) Tür | Glas | Fenster (? = [\ S] | $)/g;

gibt mir "Geist" Vorkommen:

glass, door, door,window, door,glass,glass,glass,window,glass 

als Satz meine gewünschten Wörter in Klammern Wrapping (Gruppe?) Wie folgt aus:

/(?:[\s]|^)(door|glass|window)(?=[\s]|$)/g; 

gibt mir nur jede tatsächliche Auftreten:

glass, door, window, door, glass, window 

was ist bisher die beste (schmalste) die ich bekommen kann.

Ich habe erwartet, dass:

/(door|glass|window)/ 

ohne/g globalen Flag würde ich das erste Vorkommen von „meinem“ OR „gewünschten“ OR „Worten“, aber es stoppt beim ersten Fund, "Glas".

So die Frage neu zu formulieren, (bearbeitet) Ich versuche, die erste Instanz von jeder dieser Worte (erste Tür, und das erste Fenster und erste Glas), wenn sie zeigen, bis zu finden überhaupt, umhüllt von (?: [\ s] | ^) und (? = [\ s] | $) in einem Textblock.

Vielen Dank!

+0

Verwenden 3 verschiedene reguläre Ausdrücke für jede Suche. Es wird der "lesbarste" Ansatz sein. [This] (https://regex101.com/r/UfIbeo/1) ist ungehörig und macht wenig Sinn. –

+0

Wird es versuchen. Eine Einschränkung ist, dass ich ".match" nur einmal aufrufen kann. –

Antwort

0

Out of order
passend (Weitere fortgeschrittene aus der Orderausführung siehe:
this und this )

Dies kann in einem Einzelspiel leicht gemacht werden.
Sie könnten dies tun, wenn Sie eine kleine, feste Anzahl von Wörtern haben.

Dazu müssen alle Wörter vorhanden sein.
(mit einer leichten Modifikation kann jedes Wort optional)

^(?=.*?(door))(?=.*?(glass))(?=.*?(window))

Expanded
^
(?= 
     .*? 
     (door)      # (1) 
) 
(?= 
     .*? 
     (glass)      # (2) 
) 
(?= 
     .*? 
     (window)     # (3) 
) 

Ausgabe

** Grp 0 - (pos 0 , len 0) EMPTY 
** Grp 1 - (pos 12 , len 4) 
door 
** Grp 2 - (pos 0 , len 5) 
glass 
** Grp 3 - (pos 23 , len 6) 
window 

Zusatz - Machen Sie optionale Elemente

Der Tweak Artikel optional zu machen:

^(?=.*?(?:door|window|glass))(?=.*?(door))?(?=.*?(glass))?(?=.*?(window))?

Expanded
^
(?=     # Prevent matching nothing. 
     .*? 
     (?: door | window | glass) # At least one should exist 
) 
(?= 
     .*? 
     (door)    # (1), Optiional first door 
)? 
(?= 
     .*? 
     (glass)    # (2), Optiional first glass 
)? 
(?= 
     .*? 
     (window)   # (3), Optiional first window 
)? 
+0

Das ist ein guter Anfang, und es hilft mir zu verstehen, eine Gruppe ein bisschen besser zu vergleichen. Vielen Dank. Was wäre die Änderung, um die Wörter optional zu machen? –

+0

@DavidSzego - Eine Regex hinzugefügt, um Wörter optional zu machen. Vergessen Sie nicht zu wählen, wenn Sie Antworten hilfreich finden. – sln

Verwandte Themen