1

我有一首歌的标题,例如:

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

我正在尝试匹配标题,Can't Stop。我使用 regexr 和 expresso 的混合物想出了这个正则表达式:

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

除了 Can't Stop 似乎在匹配中包含括号外,它都可以匹配它们。我显然做错了什么,但我已经玩了 4 个小时,我无法弄清楚它是什么,请指出正确的方向。

4

5 回答 5

2

(?:\(?ft|feat)不匹配“(feat”,因为\(?它只是左侧的一部分|。它将匹配“(ft”或“feat”,但不匹配“(feat”)。因为你想要一个“(”的可能性无论“feat”是否缩写,都应该\(?(?:...).

在你修复它之后,你仍然会遇到@动静能量提到的贪婪问题,你可以通过附加?到它来修复它,.*以便它只匹配所需的最少字符数。

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

于 2012-11-17T13:38:38.563 回答
2

我设法用这个来解决它。

(.+?)(?:\(|ft|feat)
于 2012-11-17T13:39:08.497 回答
0

.*就是所谓的“贪婪”,它将与开头的括号相匹配。(由于您稍后指定左括号是可选的,因此此可选部分不匹配)。要排除它,[^(]*可以改用。

于 2012-11-17T13:32:49.967 回答
0

这有效:

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

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

于 2012-11-17T13:47:29.120 回答
0

泰勒现在你的答案将只匹配带有左括号的输入,或者即使没有feat或ft。我建议你跳过使用括号,或者像下面这样使用 (.+?)(?:\(?(ft|feat ))

于 2012-11-17T18:28:44.533 回答