正则表达式从右到左阅读

fib*_*ics 14 javascript regex

我正在寻找一个简短的代码,可以将逗号放入一组数字,直到我来到这个网站.

代码:

function addCommas(nStr)
{
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}  
Run Code Online (Sandbox Code Playgroud)

工作真的很棒.有这个例子的数字集:

addCommas('83475934.89');  
Run Code Online (Sandbox Code Playgroud)

将返回"83,475,934.89",但当我阅读代码时,我希望它返回,8,3,4,7,5,934.89但这个网站解释了这一点

\d+结合使用\d{3}将匹配一组3个数字,前面跟着任意数量的数字.这使得搜索从右到左替换.

我很困惑.这段代码如何从右到左阅读?另外,是什么$1$2意味着什么呢?

Bri*_*acy 14

实际上并不是从右向左阅读.真正发生的是它重复应用(\d+)(\d{3})模式(通过while循环)并替换直到它不再匹配模式.换一种说法:

迭代1:

x1 = 83475934.89
x1.replace((\d+)(\d{3}), '$1' + ',' + '$2');
x1 = 83475,934.89
Run Code Online (Sandbox Code Playgroud)

迭代2:

x1 = 83475,934.89
x1.replace((\d+)(\d{3}), '$1' + ',' + '$2');
x1 = 83,475,934.89
Run Code Online (Sandbox Code Playgroud)

迭代3:

x1 = 83,475,934.89
x1.replace((\d+)(\d{3}), '$1' + ',' + '$2');
// no match; end loop
Run Code Online (Sandbox Code Playgroud)

编辑:

另外,$ 1和$ 2是什么意思?

这些都是回匹配的组引用(\d+)(\d{3})分别.

这是学习正则表达式实际工作方式的一个很好的参考:http:
//www.regular-expressions.info/quickstart.html


小智 7

它从右到左匹配,因为它使用贪婪的模式匹配.这意味着它首先找到所有数字(\ d +),然后尝试找到\ d {3}.例如,在数字2421567.56中,它将首先匹配数字直到'.' - 2431567 - 然后向后工作以匹配正则表达式的下一部分中的下三个数字(567).它在一个循环中执行此操作,在$ 1和$ 2变量之间添加逗号.

$表示在正则表达式中用括号形成的匹配组,例如(\ d +)= $ 1和(\ d {3})= $ 2.这样,它可以轻松地在它们之间添加字符.

在下一次迭代中,贪婪匹配在新创建的逗号处停止,并继续直到它不能匹配> 3位数.