我有很多字符串,我想从字符串中提取一个剧集名称(如果存在)。以下是一些例子
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
答案 0 :(得分:2)
您可以在正则表达式中使用正向前瞻,而不是使用负向前瞻:
(.+)(?=\s+\(#[0-9]+\.[0-9]+\))
\s
匹配任何空格,包括换行符。 Lookahead表达式将在剧集名称之前声明"\s(#s.e)"
的存在。
答案 1 :(得分:2)
此正则表达式:
^(.*?)(?=\n?\()(.*)$
确保:
\1
只返回一个名称(即使没有(#n.n)\2
仅返回(#n.n)(即使没有名字)示例(可点击演示):
我真的只想要剧集名称(如果它存在)
这非常简单:
^[^\(\)]*\b
egrep
&amp; busybox路由器)
<强> Click for demo 强>
^([^\(\W].[^\n]*?(?=$| [$\(]))\s*?(\(.[^\(]*?\))?$
\2
具有额外的灵活性,可以为您提供(#s.e)代码。
的 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)