我正在尝试创建一个用于提取歌手,词作者的正则表达式。我想知道如何让词作者搜索可选。
多行字符串示例:
Fireworks Singer: Katy Perry
Vogue Singers: Madonna, Karen Lyricist: Madonna
正则表达式:/Singers?:(.\*)\s?Lyricists?:(.\*)/
这与第二行正确匹配,并提取Singers(Madonna, Karen)
和Lyricists(Madonna)
但是当没有Lyricists时,它不适用于第一行。
如何让Lyricists搜索可选?
答案 0 :(得分:91)
您可以将要匹配的部分括在非捕获组中:(?:)
。然后它可以被视为正则表达式中的单个单元,然后您可以在其后面添加?
以使其可选。例如:
/Singers?:(.*)\s?(?:Lyricists?:(.*))?/
请注意,此处\s?
无用,因为.*
会贪婪地吃掉所有字符,并且不需要回溯。这也意味着(?:Lyricists?:(.*))
部分由于同样的原因永远不会匹配。您可以使用非贪婪版.*
,.*?
和$
来解决此问题:
/Singers?:(.*?)\s*(?:Lyricists?:(.*))?$/
一些额外的空白最终被捕获;这也可以删除,给出最终的正则表达式:
/Singers?:\s*(.*?)\s*(?:Lyricists?:\s*(.*))?$/
答案 1 :(得分:0)
只是添加Cameron的解决方案。如果源字符串有多行,每行包含Singers和Lyricists,您可能需要添加'm'多行修饰符,以便'$'匹配行尾。 (您没有说出您正在使用的语言 - 您可能还想添加'i'修饰符。)