我正在尝试创建一个用于提取歌手,歌词作者的正则表达式。我想知道如何使歌词搜索成为可选内容。
示例多行字符串:
Fireworks Singer: Katy Perry
Vogue Singers: Madonna, Karen Lyricist: Madonna
正则表达式:
/Singers?:(.\*)\s?Lyricists?:(.\*)/
这正确匹配第二行并提取
Singers(Madonna, Karen)
和Lyricists(Madonna)
但是,当没有抒情诗人时,它不适用于第一行。
如何使歌词搜索成为可选内容?
最佳答案
您可以将要匹配的部分包含在一个非捕获组中:(?:)
。然后,可以将它视为正则表达式中的单个单元,随后可以在其后放置?
以使其可选。例:
/Singers?:(.*)\s?(?:Lyricists?:(.*))?/
请注意,此处的
\s?
没用,因为.*
会贪婪地吞噬所有字符,因此无需回溯。这也意味着(?:Lyricists?:(.*))
部分出于相同的原因将永远不会被匹配。您可以使用.*
,.*?
和$
的非贪婪版本来解决此问题:/Singers?:(.*?)\s*(?:Lyricists?:(.*))?$/
一些多余的空格最终被捕获;也可以将其删除,得到最终的正则表达式:
/Singers?:\s*(.*?)\s*(?:Lyricists?:\s*(.*))?$/
关于regex - 正则表达式可选单词匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5254804/