正则表达式可选单词匹配

时间:2011-03-10 02:32:24

标签: regex

我正在尝试创建一个用于提取歌手,词作者的正则表达式。我想知道如何让词作者搜索可选。

多行字符串示例:

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

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

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

但是当没有Lyricists时,它不适用于第一行。

如何让Lyricists搜索可选?

2 个答案:

答案 0 :(得分:91)

您可以将要匹配的部分括在非捕获组中:(?:)。然后它可以被视为正则表达式中的单个单元,然后您可以在其后面添加?以使其可选。例如:

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

请注意,此处\s?无用,因为.*会贪婪地吃掉所有字符,并且不需要回溯。这也意味着(?:Lyricists?:(.*))部分由于同样的原因永远不会匹配。您可以使用非贪婪版.*.*?$来解决此问题:

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

一些额外的空白最终被捕获;这也可以删除,给出最终的正则表达式:

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

答案 1 :(得分:0)

只是添加Cameron的解决方案。如果源字符串有多行,每行包含Singers和Lyricists,您可能需要添加'm'多行修饰符,以便'$'匹配行尾。 (您没有说出您正在使用的语言 - 您可能还想添加'i'修饰符。)