2012-04-10 12 views
2

Dies ist eine Variante von this question und this other question (by myself).Regex, um einen Teil eines optionalen Teilstrings einschließlich Zeilenumbrüchen abzustimmen

Ich habe eine Zeichenfolge, die ich mit Regex analysieren muss. Die Zeichenfolge lautet etwa:

The XXX is blue. 
The XXX is blue, 
and the YYY is green. 
The XXX is blue, 
and the YYY is green. 
The XXX is blue. 
The XXX is blue. 
The XXX is blue. 
The XXX is blue. 
The XXX is blue, 
and the YYY is green. 

Der obige Code steht für eine einzelne Zeichenfolge einschließlich Zeilenvorschub. Beachten Sie, dass auf einige Sätze eine optionale Subklausel nach einem Komma folgt. In diesen zweiteiligen Sätzen gehört das YYY zu dem vorhergehenden XXX.

Ich brauche die XXX alle und ihre entsprechenden YYY anzupassen, so dass das Ergebnis sollte in etwa so aussehen: ("*")

[1][1] XXX 
[1][2] 
[2][1] XXX 
[2][2] YYY 
[3][1] XXX 
[3][2] YYY 
[4][1] XXX 
[4][2] 
[5][1] XXX 
[5][2] 
etc. 

XXX und YYY ein beliebiges Zeichen sein könnte

Wie kann Ich schreibe eine Regex, die sowohl XXX als auch YYY entspricht? (Denken Sie daran, YYY optional sein könnte ich PHP verwenden..)

+0

Welche Sprache verwenden Sie? –

+0

Welche Sprache oder Werkzeug? Sind auch die '\ n' Zeilen-Feeds? oder sind sie Literale? –

Antwort

2

Die Antwort darauf ist sehr ähnlich wie die erste Frage, die Sie verknüpft:

The (.*?) is blue(?:\.|,\nand the (.*?) is green\.) 

anzeigen Arbeits: http://www.rubular.com/r/MONXq83J80

+0

passt das '\ n' nicht nur zu den Zeilenvorschubzeichen? musst du ihnen nicht noch einmal entkommen? –

+1

@CodeJockey - In Anbetracht der OP-Staaten "bitte beachten Sie die Zeilenumbrüche!" In seinem Beitrag denke ich, dass es sich tatsächlich um Zeilenvorschubzeichen handelt, im Gegensatz zu einem '\' gefolgt von einem 'n'. –

+0

Danke. Ich habe meine Frage geändert, um es klarer zu machen. –

0

Da es scheint die gleiche Satzstruktur zu sein, die Auslöser könnten einfach sein
The/the. Es wäre albern, ausführlich zu sein.

/^The (.*) is.*(?:\n.*the (.*) is)?/m 

global und mehrzeiligen Modus (nur, Punkt nicht Newline enthalten)

+0

Works. Vielen Dank. –

+0

Ich wusste das, bevor ich es gepostet habe. – sln

+0

lol wollte dir nur mit Worten danken, weil ich nicht den Ruf habe, abzustimmen und schon eine andere Antwort akzeptiert habe –

Verwandte Themen