在類似a_b_c
的情況下,爲避免b
被包含第一個下劃線(這會阻止第二個下劃線被匹配)的匹配消耗,可以使用一個lookahead來檢查當前位置的匹配,但會不消耗任何輸入。 (甚至更容易將是一個前瞻和回顧後,但JavaScript不支持lookbehinds。)
/[a-zA-Z0-9]_(?=[a-zA-Z0-9])/g
除此之外,唯一的原因,你會得到只有一個匹配的是,你沒有包括/g
(全球)的標誌。 /g
影響String#match
,方法是使其返回所有匹配項,而不是第一個匹配項的所有捕獲項,即String#replace
,方法是使其替換所有實例而不是第一個匹配項,而RegExp#exec
繼續匹配前一匹配項,以便可以使用它在一個循環中。
這裏有一個替代所有這些下劃線以固定字符串,**
:
s.replace(/([a-zA-Z0-9])_(?=[a-zA-Z0-9])/g, '$1**');
如果你需要完整的環境,使更換,你可以保持+
量詞在第一組中,並把在前瞻中的一個捕獲組。 (這仍然有效!)
一個例子可能做出更清晰的 - 這裏有一個,將增加每對數字的字符串像150_297_832
:
var s = '150_297_832';
var result = s.replace(/(\d+)_(?=(\d+))/g, function (match, left, right) {
var sum = parseInt(left, 10) + parseInt(right, 10);
return ' (' + sum + ') ';
});
// result = ' (447) (1129) 832';
// 447 is 150 + 297, 1129 is 297 + 832, 832 was not replaced
你:
要與之相匹配的組和
.replace(search, replacement)
綁在一起了一切必須使用正則表達式?否則,只需執行'ChIJww8705e81qjAgU_IJww8705ZZkW_e81qjAg_ChIJww8.split(「_」),結果數組的大小將給你一個答案。 – Bindrid啊我應該提到我匹配的字符串可以包含多行下劃線。例如:foo___bar___rad我只需要用字符包圍的單個下劃線 – onepixelsolid