2016-01-12 65 views
1

我試圖找到全部單個下劃線被一個字符串中的一個或多個字母或數字包圍。例如:正則表達式匹配所有單個下劃線包圍在一個或多個字母或數字中

ChIJww8705e81qjAgU_IJww8705ZZkW_e81qjAg_ChIJww8 

*注意:字符串的長度和下劃線的數量是未知的。該字符串也可以包含多個下劃線。 *

我敢肯定這很容易,但我不是超級睿智與正則表達式。這是我到目前爲止,但它只匹配第一次出現。

[a-zA-Z0-9]+(_)+[a-zA-Z0-9] 

最終目標是用另一個字符替換下劃線。

+0

你:

/[\w]_[\w]/g 

要與之相匹配的組和.replace(search, replacement)綁在一起了一切必須使用正則表達式?否則,只需執行'ChIJww8705e81qjAgU_IJww8705ZZkW_e81qjAg_ChIJww8.split(「_」),結果數組的大小將給你一個答案。 – Bindrid

+0

啊我應該提到我匹配的字符串可以包含多行下劃線。例如:foo___bar___rad我只需要用字符包圍的單個下劃線 – onepixelsolid

回答

1

試試這個正則表達式:

([a-zA-Z0-9])_([a-zA-Z0-9]) 

您可以使用它像這樣用於替換它「 - 」

str.replace(/([a-zA-Z0-9])_([a-zA-Z0-9])/g, "$1-$2") 

可以代替添加任何其他字符或字符串「 - 」

此正則表達式匹配(AZ或az或0-9),下劃線和(AZ或az或0-9)

說明:

[a-zA-Z0-9]匹配小或大寫的字母和數字。

():製作一組匹配,([a-zA-Z1-9])將其組成一組,以便在解決方案中使用它。

_顯然與下劃線相匹配。

$1$2替換字符串指的是正則表達式中的第一個和第二個匹配組。

+1

請解釋 - 對於未來的訪問者以及OP,這些正則表達式匹配的內容。 –

+0

'\ w'已經是'\ d'的超集,它還包含'_',它可能不應該。它應該是'[a-z \ d]'或'[a-zA-Z \ d]'而不是'[\ d \ w]'。爲了在字符類中的可讀性,許多人可能會使用'0-9'而不是'\ d',因爲在字符類'\ d'中不會節省太多。 – ShadowRanger

+0

已更新@DavidThomas,感謝提及ShadowRanger,但已在David的評論後更新它 – Sachin

2

在類似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 
0

你幾乎沒有,考慮你的正則表達式:

[a-zA-Z0-9]+ // a-z, A-Z and 0-9, matched one or more times (greedy) 
(_)+   // _ in capture group, matched one or more times (greedy) 
[a-zA-Z0-9] // a-z, A-Z and 0-9, matched exactly one time 

你並不需要在下劃線前面匹配多個字符,無論你需要匹配多個下劃線:

/[a-zA-Z0-9]_[a-zA-Z0-9]/g 
//      ^Note the global flag 

您還可以使用\w等於:[A-Za-z0-9_],但要注意它也符合下劃線:

// Replace all underscores with dashes (-) 
var str = 'ChIJww8705e81qjAgU_IJww8705ZZkW_e81qjAg_ChIJww8'; 
str.replace(/([\w])_([\w])/g, '$1-$2'); 
//       ^^ 
//        | Refers to second match group `([\w])` 
//        Refers to first match group `([\w])` 
+0

如果字符串有多個下劃線,這個不起作用。例如:''ChIJww8705e81qjAgU ___ IJww8705ZZkW_e81qjAg ___ ChIJww8'在這個例子中,我只想捕獲* W *和* e *字符之間的下劃線。 – onepixelsolid

相關問題