正则表达式,与or运算符一起理解lookbehind

时间:2015-08-07 07:53:14

标签: regex sublimetext3 regex-lookarounds

这更像是一个理解问题,而不是一个实际问题。情况说明如下。我在两个引号“”之间得到了一些浮点数(例如金额)。

示例:

  1. “1,23”
  2. “12,23”
  3. “123,23”
  4. 现在我想在这些表达式中匹配逗号。我构建了以下适用于我的正则表达式:

    (?<=\"[0-9]|[0-9]{2})(,)(?=[0-9]{2}\")
    

    我不完全理解的部分是与“或”结合的外观。但是让我们分手吧:

    (
    ?<=             //Start of the lookbehind
    \"              //Starting with an escaped quotation mark "
    [0-9]           //Followed by a digit between 0 and 9
    

    现在我遇到了问题,在引号后并不总是只有一位数,如示例2和3所示。范围运算符例如{1,3}在外观中不起作用。正如我在see the doc stackoverflow问题中发现的那样。

    所以我决定使用或者“|” operator as sugested another

    |[0-9]{2}       //Or followed by two digits between 0 and 9
    )
    

    有趣的是,它也匹配第三个例子“123,23”中的逗号。我真的不明白为什么。 另外我不知道为什么我不必在“|”之后添加起始引号操作员再次,因为我认为完整的lookbehind直到或运算符将被修改或重复,例如:

    (?<=\"[0-9]|\"[0-9]{2})(,)(?=[0-9]{2}\")            //This however does not work at all
    

    因此,在我的理解中,匹配所有三个示例的相应正则表达式应如下所示:

    (?<=\"[0-9]|\"[0-9]{2}|\"[0-9]{3})(,)(?=[0-9]{2}\")
    

    或者至少(如果有人可以解释缺失的“):

    (?<=\"[0-9]|[0-9]{2}|[0-9]{3})(,)(?=[0-9]{2}\")
    

    我希望有人能够帮助我了解情况。

    //编辑: 如果它特别有意义,我在sublime text 3编辑器的常规文本文件中使用这个正则表达式来搜索逗号并替换它。

1 个答案:

答案 0 :(得分:6)

你是对的,

(?<=\"[0-9]|\"[0-9]{2}|\"[0-9]{3})(,)(?=[0-9]{2}\")
在这种情况下,

应该是正确的正则表达式。

<小时/> 关于为什么你的&#34;唐&#39;吨需要\"两个和三个数字&#34; 的 - 你真的需要它

(?<=\"[0-9]|[0-9]{2}|[0-9]{3})(,)(?=[0-9]{2}\")

也会匹配12,23"123,23"

<小时/> 的修改: 看起来问题是Sublime不允许可变长度的lookbehind,即使它们与|一起列出。含义(?<=\"[0-9]|\"[0-9]{2}|\"[0-9]{3})将失败,因为替代品的大小不同 - 2,3,4

这是因为Sublime似乎正在使用Boost library正则表达式。 There声明:

  

回顾后

     

(?<=pattern)消耗零个字符,仅当模式可以与当前位置之前的字符匹配时(模式必须是固定长度)。

     

(?<!pattern)消耗零个字符,仅当模式不能对当前位置之前的字符相匹配(的模式必须是固定长度的)。

另一种方法是将看守分开:

(?:(?<=\"[0-9])|(?<=\"[0-9]{2})|(?<=\"[0-9]{3}))(,)(?=[0-9]{2}\")

<小时/> 如果你不想列出所有可能的长度,你能做什么?

有一个凉爽特技其存在于一些正则表达式引擎(包括Perl&#39; S,红宝石&#39; S卓异&#39; S) - \K\K大致翻译的内容是&#34;删除到目前为止匹配的所有内容&#34; 。因此,您可以匹配引号括起的浮点数中的任何,

"\d+\K,(?=\d+")

See it in action