正则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”多行修饰符,以便“$”匹配行尾。 (你没有说你正在使用什么语言 – 你可能也想添加'我'修饰符。)