我有一首歌曲标题如下:
Cant Stop (feat. Akon) American Superstar feat Akon American Superstar ft someone American Superstar ft. someone
我试图只匹配标题,不能停止。我使用regexr和expresso的混合物来提出这个正则表达式:
(.*)(?:\(?ft|feat)
它匹配它们都OK,除了Can not Stop似乎包括匹配中的括号。我显然做错了什么,但我已经玩了4个小时,我不知道它是什么,请指出我正确的方向。
答案 0 :(得分:2)
(?:\(?ft|feat)
与“(专长”不匹配,因为\(?
只是|
左侧的一部分。它将匹配“(ft”或“feat” ,但不是“(专长”。由于你想要“(”不论是否“壮举”的缩写,你应该将\(?
移到(?:...)
之外。
解决之后,你仍然会遇到@动静能量提到的贪婪问题,可以通过将?
附加到.*
来解决这个问题,以便它只匹配所需的最小字符数
这样就可以解决所有问题:(.*?)\(?(?:ft|feat)
答案 1 :(得分:2)
我设法解决了这个问题。
(.+?)(?:\(|ft|feat)
答案 2 :(得分:0)
.*
是所谓的“贪婪”,它将与开幕式相匹配。 (由于您稍后指定开启paren是可选的,因此该可选部分不匹配)。要排除它,可以使用[^(]*
代替。
答案 3 :(得分:0)
这有效:
(.*?)(?=\(?(ft|feat))
它总结了其他答案中的内容(贪婪和优先问题)加上它使用了积极的前瞻。
答案 4 :(得分:0)
泰勒现在你的答案将匹配输入只是打开括号或即使没有专长或英尺。 我建议你跳过使用括号,否则使用如下(。+?)(?:\(?(ft | feat))