【问题标题】:Regex Not Adhering to Value in Curly Braces正则表达式不遵守花括号中的值
【发布时间】:2014-09-17 18:12:54
【问题描述】:

我在 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 位为空 ("") 的每条记录,我认为结果相差几千条记录。

【问题讨论】:

    标签: regex


    【解决方案1】:

    模式第一部分的第 14 个实例匹配 "","1/9/2007 12:00:00 AM"。仅仅因为匹配不贪心并不意味着它不会在需要时延长以进行匹配。

    你可以试试

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

    或者使用 ^ 锚来代替换行符

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的解释。您对我如何检查第 15 个位置是否为空有任何建议吗?
      【解决方案3】:

      根据RegexBuddy,它确实匹配该行。鉴于示例数据,我并不完全清楚它应该或不应该匹配什么,但 RegExBuddy 同意它是匹配的。

      谁能解释一下这是为什么?

      我认为这是因为(".*?",) - 具体来说,您可以匹配没有任何内容的引号。这将允许根据量词计算任何引号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多