正则表达式包括非捕获组中的字符



我有一首歌名是这样的:

Cant Stop (feat. Akon)
American Superstar feat Akon
American Superstar ft someone
American Superstar ft. someone

我试图只匹配标题,无法停止。我使用正则表达式和 expresso 的混合提出了这个正则表达式:

(.*)(?:(?ft|feat)

它匹配它们都OK,除了无法停止的地方似乎包括匹配中的括号。我显然做错了什么,但我已经玩了 4 个小时,我不知道它是什么,请指出我正确的方向。

我设法用这个修复了它。

(.+?)(?:(|ft|feat)

(?:(?ft|feat)不匹配"(壮举",因为(?只是|左侧的一部分。 它将匹配"(ft"或"feat",但不会匹配"(feat"。 由于您希望"("的可能性,无论是否缩写"feat",因此您应该将(?移到(?:...)之外。

修复此问题后,您仍然会遇到@動靜能量提到的贪婪问题,您可以通过将?附加到.*来修复该问题,以便它仅匹配所需的最小字符数。

这给出了这个,它适用于你的所有示例:(.*?)(?(?:ft|feat)

.*就是所谓的"贪婪",它将匹配开场白。 (由于您稍后指定了开场白是可选的,因此此可选部分不匹配)。要排除它,可以改用[^(]*

这有效:

(.*?)(?=(?(ft|feat))

它总结了其他答案(贪婪和优先问题)中所说的内容,并使用了积极的展望。

泰勒 现在您的答案将仅匹配带有开括号的输入,或者即使没有壮举或英尺。 我建议您跳过使用括号,否则使用如下(.+?(?:\(?(英尺|壮举))

最新更新