2016-04-15 27 views
2

Ich entschuldige mich für die Regex Frage passen, aber ..Wie entweder/oder mit Regex

ich zum Schaben Job Titel einen regulären Ausdruck zu entwickeln.

Der Job Titel wird immer im Format:

Berufsbezeichnung: Word1 Wort2 (Optional Wort3)

Am Minute Im Moment habe ich dies:

Job Title: ([A-Z\w]+ [A-Z\w]+)|Job Title: ([A-Z\w]+ [A-Z\w]+ [A-Z\w]+) 

Ich versuche, um es Jobnamen mit zwei oder drei Wörtern zu finden, und jede Seite des Pipe-Charakters funktioniert einzeln (linke Seite entspricht 2-Wort-Jobtiteln, rechte Seite entspricht 3-Wort-Jobtiteln), wenn ich jedoch nur das Pipe-Zeichen hinzufüge geht für die linke Hälfte, passend 2 Wort Jo b Titel.

Hat jemand eine Idee, was ich falsch mache?

NB: Ich verwende Regexper, um meinen Ausdruck zu visualisieren, und es sieht dort richtig aus.

Prost.

+0

Ist das regex Geschmack ES5 oder PCRE oder jede andere? In welcher Sprache verwenden Sie es? –

+0

Was kommt nach dem zweiten Wort? Ein anderes Wort?Wenn ja, wie unterscheiden Sie das von einem dritten Job-Titel-Wort? Worauf ich hinaus will ist - wenn die Linie dort endet, warum nicht den Rest der Linie ergattern? I.e. 'Job-Titel: (. *) $' – ClasG

Antwort

2

Der Grund dafür ist, dass der linke Teil die gleiche Teilzeichenfolge (an der gleichen Position) übereinstimmen kann, was die richtige Alternative übereinstimmen kann, und das Muster ist nicht verankert. Sie müssen es entweder verankern oder die Alternativen tauschen. Oder verwenden Sie eine optionale Gruppe. Hier ist eine erweiterte Version:

Job Title: ([A-Z]\w* [A-Z]\w*(?: [A-Z]\w*)?) 
          ^^^^^^^^^^^^^^ 

Siehe regex demo

Wenn Sie sich nicht, wenn die Anfangsbuchstabe groß- oder kleingeschrieben sind, fügen Sie das /i Groß- und Kleinschreibung Modifikator (oder das entsprechende Flag (wie re.I, RegexOptions.IgnoreCase, etc.) auf dem regex Geschmack abhängig):

/Job Title: ([A-Z]\w* [A-Z]\w*(?: [A-Z]\w*)?)/i 

da die [A-Z\w]+ wenig Sinn als \w Matches machen A-Z, empfehle ich, [A-Z]\w* zu verwenden - ein ASCII-Großbuchstabe, gefolgt von null oder mehr alphanumerischen/Unterstrichen.

Die nicht-einfangende Gruppe (?: [A-Z]\w*) wird optional (dieser Teil aus dem Eingang fehlen kann), da es mit ? quantifier quantifiziert wird, die Eins oder Null-Auftreten bedeutet.

+0

Probieren Sie diese auf für Größe;) 'Professor für Archäologie',' Dekan der Studenten', 'Königin von England'. – ClasG

+0

@ClasG: Wenn Sie darauf hinweisen, dass die Wörter nicht groß geschrieben werden müssen, dann ist es eine einfache Lösung - fügen Sie einen '/ i' Modifikator hinzu: ['/Job Title: ([AZ] \ w * [AZ ] \ w * (?: [AZ] \ w *)?)/i'] (https://regex101.com/r/xW4gI0/9). Ich habe der Antwort eine Notiz darüber hinzugefügt. –

+0

Oder einfach die '[A-Z]' ... entfernen? – ClasG

1

Wie das etwa:

Job Title: ((?: *[A-Z]\w+){2,3}) 

es Siehe in Aktion here

diese Weise, wenn die Anzahl der Worte Änderungen an einem bestimmten Punkt angenommen, Sie haben nicht viel zu ändern, um die Lösung anzupassen .

Sie können $ am Ende hinzufügen, wenn Sie den Fall nicht übereinstimmen soll, wo die Menschen mehr als 3 Wörter eingeben: wie this

+0

Und [hier ist eine weitere "Aktion"] (https://regex101.com/r/xW4gI0/6). –