2012-07-03 22 views
2

我有這個正則表達式/\b\d\b/,簡單地匹配單個數字字。JavaScript正則表達式,與OR進行零長度匹配(可能前後左右)

現在我想添加下劃線字符作爲字邊界的替代,所以我想要匹配"_1_"中的數字,同時將下劃線保持爲零長度匹配(如在\ b中,所以我不想在比賽中使用_)。

我在一個案例中使用捕獲組將不會是理想的。

我嘗試了一些積極的前瞻/背後的技巧,展望未來似乎工作,而後面的看起來沒有。試圖做可選的前瞻/後面,並採取類似_|\b,但我找不到一個理想的解決方案。

暫時不先進的正則表達式的技巧很熟悉,我想我會用正則表達式2 :)

這是在JavaScript被執行在此之前詢問。

回答

2

(?<=\b|_)\d(?=\b|_)

(?<= # Positive look-behind 
\b  # Word boundary 
|  # Or 
_  # Underscore 
)  # End group 
\d  # Digit 
(?=  # Positive look-ahead 
\b|_) # Word boundary or underscore 

它將匹配你的個位數,並且將使用或者單詞邊界(\b)或下劃線(_)相匹配。

這是零長度,所以它不會將它匹配的數字分組。

Play with the regex here

+0

這仍然將包括比賽結果的下劃線。我希望下劃線是一個零長度的可選匹配 –

+0

@SamerAbukhait你是對的,我已經編輯它,以便它不包括下劃線。 –

+0

這是我實際嘗試的RegEx,但是我得到了無效的正則表達式錯誤。我在Chrome,Node甚至Ruby 1.9上試過。它的前瞻部分工作,但後視不 –

0

由於後視效果在JS中不起作用,因此只能匹配主要的正則表達式,在您的案例\d中,然後手動檢查邊界。

const manualBoundaries = /\d/g 
const matches = []; 
while ((match = manualBoundaries.exec(str)) !== null) { 
    const m = match[0] 
    const i = match.index 
    if ((i == 0 || str[i - 1].match(/(\W|_)/)) && 
     (i + m.length == str.length || str[i + m.length].match(/(\W|_)/))) 
    matches.push(m) 
} 

或者更簡潔,用假代替

const matches = []; 
str.replace(manualBoundaries, (m, i) => { 
    if ((i == 0 || str[i - 1].match(/(\W|_)/)) && 
     (i + m.length == str.length || str[i + m.length].match(/(\W|_)/))) 
     matches.push(m); 
}); 

這裏試試:https://jsfiddle.net/djjeck/mg2gzpf1/