正则表达式内的计算

时间:2015-11-12 00:59:30

标签: javascript jquery regex variables replace

我有一个疯狂的想法。

我想在正则表达式中进行计算,但我不确定它是否可行。基本上我有一句话说:

Category:

每次点击按钮,都会说:

Category:
Category 1:
Category 2:

等。我现在正在jQuery选择器上执行一系列函数:

var newHTML = selector.closest('.row').clone().html().replace(/(Category)(\s)(\d)/g,'$1$2' + (parseInt('$3') + 1)).replace('Category:','Category 2:');

所以它首先替换它,如果它是原始的'Category'它将不匹配并将运行第二次替换。如果匹配,我希望它将表达式末尾的数字增加1。我想也许我可以parseInt()变量并添加一个,但这不起作用,因为parseInt('$3')似乎返回NaN并且不会将变量识别为整数。

我知道还有很多其他的方法可以做到这一点,但我偶然发现了它,难倒自己,总是想找到一个好问题的答案......

有什么想法?谢谢!

2 个答案:

答案 0 :(得分:2)

与许多其他语言一样,JavaScript会在之前评估传递给函数的参数。因此,在您的情况下,'$1$2' + (parseInt('$3') + 1))首先评估 ,这会产生字符串'$1$2NaN',而会将传递给.replaceparseInt('$3')NaN,因为字符串'$3'无法转换为数字:

> parseInt('$3')
NaN

如果要使用匹配项执行任何计算,则必须将函数作为第二个参数传递:

.replace(/(Category)(\s)(\d)/g, function(match, $1, $2, $3) {
  return $1 + $2 + (parseInt($3) + 1));
})

(当然你可以根据需要命名参数)

您可以在MDN documentation中了解有关将回调传递给.replace的详情。

答案 1 :(得分:1)

此外@ FelixKling的答案是一个工作演示,只是为了表明你可能做出的调整。

$('.cat').on('click', function() {
    $(this).html(function(i,html) {
        return html.replace(/(Category)(\s?)(\d*)/g, function(match, x, y, z) {
            y = y || ' ';
            z = z || 0;
  return x + y + (+z + 1);
});
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="cat">Category</div>
<div class="cat">Goint with Category  Blah Blah Blah</div>