正则表达式不符合卷曲大括号的价值

时间:2014-09-17 18:12:54

标签: regex

我在Notepad ++ v6.6.8中使用以下正则表达式

\n(".*?",){14}""

它匹配它应该的行,但它也匹配它不应该的行。例如,我不希望它匹配以下行:

"Sold","421","421","67","1/9/2007 12:00:00 AM","","3","","","","","","","","1/9/2007 12:00:00 AM","","","","True","4601","1/3/2011 5:44:17 PM",""

但是,它会在第二次出现日期时匹配。出于好奇,我将花括号中的值更改为15,并返回完全相同的匹配。有人能解释一下为什么会这样吗?我试图快速计算CSV文件中第15个位置为空("")的每条记录,我认为结果是几千条记录。

3 个答案:

答案 0 :(得分:1)

模式第一部分的第14个实例匹配"","1/9/2007 12:00:00 AM"。仅仅因为比赛不贪婪并不意味着如果需要进行比赛就不会延长。

您可以尝试类似

的内容
\n("[^"]*",){14}""

或者使用^锚而不是匹配换行符

^("[^"]*",){14}""

答案 1 :(得分:1)

(".*?",){14}""进行贪婪的比赛。此(".*?",){14}正则表达式将匹配确切的14次出现,并且正则表达式引擎也会尝试匹配以下""模式。但是在""第14次出现之后,".*?",没有"1/9/2007 12:00:00 AM",有一个不是""的字符串"",,所以正则表达式引擎向上移动到""下一个{{1}}。一旦找到,它就会匹配该字符串以获得匹配。

通过从模式中删除以下{{1}}来查看差异。 Herehere

答案 2 :(得分:0)

根据RegexBuddy,它确实匹配该行。在给出示例数据的情况下,我并不完全清楚它应该或不应该匹配,但RegExBuddy同意它是匹配的。

RegexBuddy showing match

  

有人可以向我解释为什么会这样吗?

我认为这是因为(".*?",) - 特别是,您可以匹配报价而没有任何内容。这将允许任何报价计入量词。