正则表达式模式 - 排除字符串的一部分

时间:2017-05-18 21:11:35

标签: regex groovy negative-lookahead

我有很多字符串,我想从字符串中提取一个剧集名称(如果存在)。以下是一些例子

The Case of the Case
(#1.1)
Cameron Diaz/Mark Ronson & Bruno Mars (#40.7)
Cameron Diaz/Smashing Pumpkins (#24.1)
Candice Bergen/Cher (#13.5)

所以完整的一行包括“剧集名称(#se)”,其中s是系列号,e是剧集编号,但正如你所看到的,有时可能没有系列/剧集编号,有时可能没有剧集名称

我有以下正则表达式

(.+ )(?! \(\#[0-9]+\.[0-9]+\))

因此,第1组应该拔出剧集名称,上述模式似乎适用于除The Case of the Case以外的所有情况,而不是完整的剧集名称,它只会提出The Case of the任何想法?< / p>

澄清我们应该从上面得到的匹配

The Case of the Case
Cameron Diaz/Mark Ronson & Bruno Mars
Cameron Diaz/Smashing Pumpkins
Candice Bergen/Cher

4 个答案:

答案 0 :(得分:2)

您可以在正则表达式中使用正向前瞻,而不是使用负向前瞻:

(.+)(?=\s+\(#[0-9]+\.[0-9]+\))

RegEx Demo

\s匹配任何空格,包括换行符。 Lookahead表达式将在剧集名称之前声明"\s(#s.e)"的存在。

答案 1 :(得分:2)

编辑 - 根据评论:

此正则表达式:

^(.*?)(?=\n?\()(.*)$

确保:

  • \1 只返回一个名称(即使没有(#n.n)
  • \2 仅返回(#n.n)(即使没有名字)
  • 跳过不适合此模式的文字。

示例(可点击演示):

enter image description here

enter image description here

OR

基于此:

  

我真的只想要剧集名称(如果它存在)

这非常简单:

^[^\(\)]*\b
  • 这也适用于POSIX 1003.2扩展正则表达式(即兼容egrep&amp; busybox路由器)


<强> Click for demo

Click for demo

或者

替代第二组

^([^\(\W].[^\n]*?(?=$| [$\(]))\s*?(\(.[^\(]*?\))?$

\2具有额外的灵活性,可以为您提供(#s.e)代码。


Click for demo

Click for demo

答案 2 :(得分:2)

由于您是逐行阅读的,并且您只想从行中删除(#<NUM}.<NUM>)部分,因此最简单的解决方案是使用以下正则表达式替换

def s = "Cameron Diaz/Mark Ronson & Bruno Mars (#40.7)"
print(s.replaceFirst(/\s+\(#\d+\.\d+\)$/, ""))
// => Cameron Diaz/Mark Ronson & Bruno Mars

如果没有匹配,字符串将不加修改地返回。请参阅the regex demo

$匹配字符串的结尾。如果剧集详细信息可能出现在字符串中的非最终位置,请删除锚点。

<强>详情

  • \s+ - 一个或多个空格
  • \( - 文字(
  • # - 文字#
  • \d+ - 一位或多位
  • \. - 一个点
  • \d+ - 一位或多位
  • \) - 文字)
  • $ - 字符串锚点结束

答案 3 :(得分:0)

你可以这样做:

^([^(]+)(?: \(\#\d+\.\d+\))?

Demo & Explanation