我有一首歌名是这样的:
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))
它总结了其他答案(贪婪和优先问题)中所说的内容,并使用了积极的展望。
泰勒 现在您的答案将仅匹配带有开括号的输入,或者即使没有壮举或英尺。 我建议您跳过使用括号,否则使用如下(.+?(?:\(?(英尺|壮举))