正则表达式:逗号分隔大整数(例如 2903 -> 2,903)
Regex: Comma Delimiting large integers (e.g. 2903 -> 2,903)
正文如下:
1234567890
正则表达式:
s/(\d)((\d\d\d)+\b)/,/g
预期结果:
1,234,567,890
实际结果:
1,234567890
这是一个示例,用于从 mastering regular expression
从右到左每 3 位数字添加一个逗号。解释如下:
This is because the digits matched by (\d\d\d)+ are now actually part of the final match, and so are not left "unmatched" and available to the next iteration of the regex via the /g.
但是我还是不太明白,希望大家能帮我详细解答一下。提前致谢。
先决条件
正则表达式引擎将从左到右匹配每个字符。匹配的字符被引擎消耗。一旦被消耗,你就不能返回再次消耗这些字符。
如何匹配 (\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.
现在奇迹发生了。看到引擎消耗了所有字符并且指针已到达输入的末尾并成功匹配。替换 ,
发生。现在无法将指针重新跟踪回
1234567890
|
(\d)
为了得到预期的结果
解决方案
您没有提到您使用的是哪种语言。假设语言支持PCRE。
前瞻在这里会有很大用处。
s/(\d)(?=(\d\d\d)+\b)/,/g
这里第二组(?=(\d\d\d)+\b)
是向前看,不消耗任何字符,但检查字符是否可以匹配
或
环顾四周
s/(?<=\d)(?=(\d\d\d)+\b)/,/g
这里
(?<=\d)
往后看。检查前面是否有数字
(?=(\d\d\d)+\b)
向前看。检查是否后跟 3 位数字。
- Note on look arounds
正文如下:
1234567890
正则表达式:
s/(\d)((\d\d\d)+\b)/,/g
预期结果:
1,234,567,890
实际结果:
1,234567890
这是一个示例,用于从 mastering regular expression
从右到左每 3 位数字添加一个逗号。解释如下:
This is because the digits matched by (\d\d\d)+ are now actually part of the final match, and so are not left "unmatched" and available to the next iteration of the regex via the /g.
但是我还是不太明白,希望大家能帮我详细解答一下。提前致谢。
先决条件
正则表达式引擎将从左到右匹配每个字符。匹配的字符被引擎消耗。一旦被消耗,你就不能返回再次消耗这些字符。
如何匹配 (\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.
现在奇迹发生了。看到引擎消耗了所有字符并且指针已到达输入的末尾并成功匹配。替换 ,
发生。现在无法将指针重新跟踪回
1234567890
|
(\d)
为了得到预期的结果
解决方案
您没有提到您使用的是哪种语言。假设语言支持PCRE。
前瞻在这里会有很大用处。
s/(\d)(?=(\d\d\d)+\b)/,/g
这里第二组(?=(\d\d\d)+\b)
是向前看,不消耗任何字符,但检查字符是否可以匹配
或
环顾四周
s/(?<=\d)(?=(\d\d\d)+\b)/,/g
这里
(?<=\d)
往后看。检查前面是否有数字(?=(\d\d\d)+\b)
向前看。检查是否后跟 3 位数字。
- Note on look arounds