以下是文字:
1234567890
正则表达式:
s/(\d)((\d\d\d)+\b)/\1,\2/g
预期结果:
1234567890
实际结果:
1,234567890
这是一个用于从mastering regular expression
开始从右到左添加逗号的示例。这是解释:
这是因为(\ d \ d \ d)+匹配的数字现在实际上是最终匹配的一部分,因此不会保持“不匹配”,并且可以通过/ g用于下一次正则表达式的迭代。
但我仍然不理解它,我希望任何人都可以帮助我详细解决它。提前谢谢。
答案 0 :(得分:1)
<强>前提条件强>
正则表达式引擎将从左到右匹配每个字符。并且匹配的字符由引擎消耗。一旦消耗掉,你就不能再回头重新创造这些角色了。
(\d)((\d\d\d)+\b)
1234567890
|
(\d)
1234567890
|||
(\d\d\d)+
1234567890
|
\b #cannot be matched, hence it goes for another `(\d\d\d)+`
1234567890
|||
(\d\d\d)+
1234567890
|
\b #cannot be matched, hence it goes for another `(\d\d\d)+`
1234567890
|||
(\d\d\d)+
1234567890
|
\b #matched here for the first time.
现在魔法发生了。查看引擎消耗了所有字符,并且指针已成功匹配到达输入的末尾。取代\1,\2
发生。现在没有办法将指针回溯到
1234567890
|
(\d)
为了获得预期的结果
<强>解决方案强>
您没有提到您使用的是哪种语言。假设该语言支持PCRE。
展望未来将在这里发挥作用。
s/(\d)(?=(\d\d\d)+\b)/\1,/g
此处第二组(?=(\d\d\d)+\b)
是向前看并且不消耗任何字符,但会检查字符是否匹配
或强>
使用环顾四周
s/(?<=\d)(?=(\d\d\d)+\b)/,/g
下面
(?<=\d)
看后面。检查是否有数字
(?=(\d\d\d)+\b)
展望未来。检查后跟3位数字。