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

时间:2012-11-17 13:25:45

标签: c# .net regex

我有一首歌曲标题如下:

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个小时,我不知道它是什么,请指出我正确的方向。

5 个答案:

答案 0 :(得分:2)

(?:\(?ft|feat)与“(专长”不匹配,因为\(?只是|左侧的一部分。它将匹配“(ft”或“feat” ,但不是“(专长”。由于你想要“(”不论是否“壮举”的缩写,你应该将\(?移到(?:...)之外。

解决之后,你仍然会遇到@动静能量提到的贪婪问题,可以通过将?附加到.*来解决这个问题,以便它只匹配所需的最小字符数

这样就可以解决所有问题:(.*?)\(?(?:ft|feat)

答案 1 :(得分:2)

我设法解决了这个问题。

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

答案 2 :(得分:0)

.*是所谓的“贪婪”,它将与开幕式相匹配。 (由于您稍后指定开启paren是可选的,因此该可选部分不匹配)。要排除它,可以使用[^(]*代替。

答案 3 :(得分:0)

这有效:

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

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

答案 4 :(得分:0)

泰勒现在你的答案将匹配输入只是打开括号或即使没有专长或英尺。  我建议你跳过使用括号,否则使用如下(。+?)(?:\(?(ft | feat))