正则表达式过于贪婪

时间:2010-06-13 23:55:24

标签: c# .net regex regex-greedy

我正在编写一个正则表达式来匹配IMDb音轨数据文件中的数据。我的正则表达式主要是工作,虽然他们在我的命名组中插入过多的文本。以下面的正则表达式为例:

"^  Performed by '?(?<performer>.*)('? \(qv\))?$"

表演者组包括字符串' (qv)以及表演者的名字。不幸的是,由于记录的格式不一致,一些表演者的名字被单引号包围,而其他表演者则没有。这意味着就正则表达式而言它们是可选的。

我尝试使用?>组说明符将最后一个组标记为贪婪组,但这似乎对结果没有影响。

我可以通过更改执行者组来匹配一小部分字符来改善结果,但这会降低我正确解析名称的机会。此外,如果我只是排除撇号字符,那么我将无法解析,例如,包含撇号的乐队名称,例如Elia的孤独朋友乐队,他们在为生命奔跑 >生化危机:天启。

更新:以下是正则表达式应根据要求匹配的示例输入行。还提供了我现有正则表达式无法处理的其他格式。

"  Performed by 'Carmen Silvera' (qv)"

1 个答案:

答案 0 :(得分:2)

虽然我查看了IMDB音轨数据文件,但这是一个解决您当前问题的解决方案,但这并不能解决其中的所有问题。

var exp = new Regex(@"^  Performed by '?(?<performer>.*?)('? \(qv\))?$");

基本上你需要在表演者匹配上指定一个非贪婪的搜索。

我会添加一条评论来解释为什么这对你的项目来说不够好。