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

示例多行字符串:

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/

10-12 19:03