2015-11-12 107 views
2

我有一個瘋狂的想法。正則表達式中的計算

我想在正則表達式中進行計算,但我不確定是否有可能。基本上我有這樣一行:

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:'); 

那麼它做的第一替代,如果它是原來的「分類」,它會不匹配,將運行第二個替代。如果它匹配,我希望它將表達式末尾的數字加1。我想也許我可以parseInt()變量並添加一個,但這是行不通的,因爲parseInt('$3')似乎返回NaN並且不能將該變量識別爲整數。

我知道有很多其他的方法可以做到這一點,但我只是碰到它絆倒,難住了自己,總喜歡找任何答案,一個很好的問題?

有什麼想法?謝謝!

+0

你在期待'parseInt函數( '$ 3')'返回?由於'$'它無法將其解析爲數字。讓正則表達式計算'$ 3'然後修改它。 –

回答

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的更多信息。

+0

非常乾淨,容易理解。謝謝,我從來沒有在替換過程中使用過回調函數! – MillerMedia

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>