我正在尝试创建一个用于提取歌手,词作者的正则表达式.我想知道如何让词作者搜索可选.
样本多行字符串:
Fireworks Singer: Katy Perry
Vogue Singers: Madonna, Karen Lyricist: Madonna
Run Code Online (Sandbox Code Playgroud)
正则表达式: /Singers?:(.\*)\s?Lyricists?:(.\*)/
这正确匹配第二行并提取Singers(Madonna, Karen)
和Lyricists(Madonna)
但是当没有Lyricists时,它不适用于第一行.
如何使Lyricists搜索可选?
Cam*_*ron 100
您可以将要匹配的部分包含在非捕获组中:(?:)
.然后它可以被视为正则表达式中的单个单元,然后您可以?
在它之后放置它以使其可选.例:
/Singers?:(.*)\s?(?:Lyricists?:(.*))?/
Run Code Online (Sandbox Code Playgroud)
请注意,这里\s?
没用,因为.*
贪婪地吃掉所有角色,并且不需要回溯.这也意味着该(?:Lyricists?:(.*))
部件永远不会出于同样的原因进行匹配.您可以使用的非贪婪版本.*
,.*?
伴随着$
解决这个问题:
/Singers?:(.*?)\s*(?:Lyricists?:(.*))?$/
Run Code Online (Sandbox Code Playgroud)
一些额外的空白最终被捕获; 这也可以删除,给出最终的正则表达式:
/Singers?:\s*(.*?)\s*(?:Lyricists?:\s*(.*))?$/
Run Code Online (Sandbox Code Playgroud)