正则表达式可选单词匹配

Vic*_*tor 65 regex

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

样本多行字符串:

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)

  • @puk:我不确定我是否理解你的问题。`(?:)` 是一个非捕获组,这意味着它们匹配的任何内容都不能通过 `$1` 等引用。`()` 是一个捕获组,意味着它们匹配的任何内容都会被捕获并通过 `$1` 可用等等。如果你有嵌套的 `(())` 组,最外面的组将是 `$1`,最里面的组将是 `$2`,等等(这仍然遵循正常的从左到右的规则;左括号“(”决定哪个组获得哪个数字)。 (2认同)