Ich versuche, eine Regex zu erstellen, um Sänger und Texter zu extrahieren. Ich habe mich gefragt, wie ich die Suche nach Textern optional machen kann.
Beispiel für eine mehrzeilige Zeichenfolge:
Fireworks Singer: Katy Perry
Vogue Singers: Madonna, Karen Lyricist: Madonna
Regex: /Singers?:(.\*)\s?Lyricists?:(.\*)/
Dies stimmt korrekt mit der zweiten Zeile überein und extrahiert Singers(Madonna, Karen)
undLyricists(Madonna)
Aber es funktioniert nicht mit der ersten Zeile, wenn es keine Texter gibt.
Wie mache ich die Suche nach Textern optional?
$1
,$2
...) funktionieren , würden verschachtelte Klammern auch über eine Nummer referenziert?(?:)
ist eine nicht erfassende Gruppe, was bedeutet, dass alles, worüber sie übereinstimmen, nicht referenziert werden$1
kann usw.()
ist eine erfassende Gruppe, was bedeutet, dass alles, was sie übereinstimmen, erfasst und verfügbar$1
ist usw. Wenn Sie verschachtelte(())
Gruppen haben, ist die äußerste$1
und die innere wird$2
usw. sein (dies folgt immer noch der normalen Regel von links nach rechts; die öffnenden(
Klammern bestimmen, welche Gruppe welche Nummer erhält).(([a-z]{32})?):(([0-9]{32})?)
einen optionalen Benutzernamen wissen : id double. Wenn ich das auf der Zeichenfolge laufen lasse,":"
sind beide$1
und$2
leer? Was ist mit"john:"
? Gibt es ein$3
und ein$4
??
) sind je nach Sprache / Regex-Engine undefiniert / null / leer. Sie können den regulären Ausdruck in zwei Gruppen vereinfachen:([a-z]{32})?:([0-9]{32})?
oder nicht erfassende Gruppen verwenden :((?:[a-z]{32})?):((?:[0-9]{32})?)
.Nur um Camerons Lösung zu ergänzen. Wenn die Quellzeichenfolge mehrere Zeilen enthält, die jeweils sowohl Sänger als auch Texter enthalten, müssen Sie wahrscheinlich den mehrzeiligen Modifikator 'm' hinzufügen, damit das '$' mit den Zeilenenden übereinstimmt. (Sie haben nicht angegeben, welche Sprache Sie verwenden. Möglicherweise möchten Sie auch den Modifikator 'i' hinzufügen.)
quelle