正则expression式可选词匹配

我试图创build一个提取歌手,作词者的正则expression式。 我想知道如何使歌词search可选。

示例多行string:

Fireworks Singer: Katy Perry Vogue Singers: Madonna, Karen Lyricist: Madonna 

正则expression式:/ /Singers?:(.\*)\s?Lyricists?:(.\*)/ :(. /Singers?:(.\*)\s?Lyricists?:(.\*)/ :(. /Singers?:(.\*)\s?Lyricists?:(.\*)/

这匹配正确的第二行,并提取Singers(Madonna, Karen)Lyricists(Madonna)

但是当没有歌词的时候,它不适用于第一行。

如何使歌词search可选?

您可以将您想要匹配的部分放在非捕获组中:( (?:) 。 然后它可以被视为在正则expression式单个单位,随后你可以把一个? 之后使之成为可选。 例:

 /Singers?:(.*)\s?(?:Lyricists?:(.*))?/ 

请注意这里的\s? 是没用的,因为.*会贪婪地吃掉所有的angular色,不需要回溯。 这也意味着(?:Lyricists?:(.*))部分永远不会因为相同的原因而匹配。 您可以使用非贪婪版本的.*.*?$一起解决这个问题:

 /Singers?:(.*?)\s*(?:Lyricists?:(.*))?$/ 

一些额外的空白结束捕获; 这也可以删除,给最后的正则expression式:

 /Singers?:\s*(.*?)\s*(?:Lyricists?:\s*(.*))?$/ 

只需要添加到Cameron的解决scheme。 如果源string有多行,每行都包含歌手和歌词作者,则可能需要添加“m”多行修饰符,以便“$”匹配行尾。 (你没有说你正在使用什么语言 – 你可能也想添加'我'修饰符。)