2017-07-26 59 views
1

結束使用正則表達式的字符串的後綴我想找出這樣的前綴和字符串的後綴:正則表達式匹配的前綴和數字

T12231 should match ['T', '12231'] 

Acw2123 should match ['Acw', '2123'] 

121Ab should match ['121ab', null] 

1213 should match [null, '1213'] 

在字符串的結尾匹配只能號碼輕鬆完成這個正則表達式/([0-9]+)$/g

匹配所有從字符串開頭到這一點,我沒有設法做。我得到的最接近的是第一組匹配的所有內容,但最後一個數字是/^(.*)([0-9]+)$/g

+2

第一組可能是 「什麼,這不是一個數字」,或者從你的例子,「任何大寫/小寫字母字符「。 '\ d'與'[0-9]'相同,'\ D'與'[^ 0-9]'相同,所以你可以尋找類似'/ ^(\ D *?) d +)$ /'...如果你同時使用'^'和'$','/ g'就沒有意義,因爲它會匹配整行。 –

+0

「123Ab345」匹配什麼? – sln

+0

@sln ['1234Ab','345'] – toskv

回答

3

您可以第一個捕捉組懶惰,.*?所以它匹配儘可能短,即,使第二捕獲組儘可能長:

var s = ["T12231", "Acw2123", "121Ab", "1213"]; 
 

 
console.log(
 
    s.map(x => x.replace(/^(.*?)([0-9]*)$/, "$1 $2")) 
 
);

推分裂導致到一個數組:

var s = ["T12231", "Acw2123", "121Ab", "1213"]; 
 

 
var arr = []; 
 
s.forEach(x => x.replace(/^(.*?)([0-9]*)$/, (string, $1, $2) => arr.push([$1, $2]))); 
 

 
console.log(arr);

+0

這就是我一直想念的。懶惰的評估是有用的。謝謝! – toskv

+0

不客氣。很高興幫助! – Psidom

1

你幾乎是對的。嘗試使用這樣的:

var re = /^(.*?)(\d+.*)$/g; 
var groups = re.exec(your_string) 
+0

這確實匹配正確。第二組最後允許任何角色。 '123Ab456'獲得匹配結果爲['','123Ab456'] – toskv

+0

是不是應該發生? –

+0

不,我期望在這種情況下得到['123Ab','456']。我試圖解決的問題是生成一個'123Ab456'將是'123Ab457'的下一個字符串。所以我需要在字符串中的最後一個數字,其餘的我可以將它們縫合在一起。 – toskv

1

滿足所有情況下

^(?=\d|.*\d$)((?:(?!\d+$).)*)(\d*)$

https://regex101.com/r/BWwsIA/1

^       # BOS 
(?= \d | .* \d $)   # Must begin or end with digit 
(       # (1 start) 
     (?:       # Cluster begin 
      (?! \d+ $)     # Not digits then end 
      .        # Any char 
    )*       # Cluster end, 0 to many times 
)        # (1 end) 
(\d*)      # (2) 
$        # EOS 
相關問題