这更像是一个理解问题,而不是一个实际问题。情况说明如下。我在两个引号“”之间得到了一些浮点数(例如金额)。
示例:
现在我想在这些表达式中匹配逗号。我构建了以下适用于我的正则表达式:
(?<=\"[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编辑器的常规文本文件中使用这个正则表达式来搜索逗号并替换它。
答案 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"
。
|
一起列出。含义(?<=\"[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+")