簡體   English   中英

正則表達式匹配由一個或多個字母或數字包圍的所有單個下划線

[英]Regex match all single underscores surrounded in one or more letters or numbers

我正在嘗試找到所有單個下划線 ,這些下划線被一個字符串中的一個或多個字母或數字包圍。 例如:

ChIJww8705e81qjAgU_IJww8705ZZkW_e81qjAg_ChIJww8

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

我確信這很容易,但我對正則表達式並不陌生。 這是我到目前為止所做的,但它只匹配第一次出現。

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

最終目標是用另一個角色替換下划線。

在像a_b_c這樣的情況下,為了避免b包括第一個下划線(這會阻止匹配第二個下划線)的匹配消耗b ,你可以使用前瞻,它檢查當前位置的匹配但不消耗任何輸入。 (更簡單的是前瞻和后視,但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

試試這個正則表達式:

([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指的是正則表達式中的第一個和第二個匹配組。

你幾乎在那里,考慮你的正則表達式:

[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_] ,但請注意它也匹配下划線:

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

將所有內容與匹配組和.replace(search, replacement)綁定在一起:

// 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])`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM