2017-02-17 166 views
2

我有以下字符串匹配字符串

富:21條:11

其中foo和bar不常數,所以我想匹配所有最後的「:」(冒號)字符後的數字。

const myString = 'foo: 21, bar: 11' 
myString.match(/\d+/g).shift().join() -> 11 

我可以只使用純正則表達式嗎?

謝謝!

+0

可以使用'str.match(/:\ S *(\ d +)$ /)[1]'。 – Tushar

+0

有時字符串只是「bar:11」,所以我想避免使用[1] – Anderson

回答

2

使用負正則表達式,你可以使用這個表達式:

/\d+(?![^:]*:)/g 

RegEx Demo

(?![^:]*:)爲負先行斷言,有超前的數字沒有:我們匹配。

代碼演示:

var myString = 'foo: 21, bar: 11'; 
 
console.log(myString.match(/\d+(?![^:]*:)/g));

+0

此解決方案與我的方法不同,因爲它會提取最後一個':'之後的多個數字塊 - 請參閱[本演示](https:// regex101的.com/R/xFNZ0z/1)。如果沒有':'([demo](https://regex101.com/r/xFNZ0z/2)),它也會抓住數字。但我不知道這對OP是否有任何重要性。 –

1

var myString = 'foo: 21, bar: 11'; 
 
console.log(myString.replace(/(.)*\:\s?/,''));

+1

這是幹什麼的?在最新之前更換一切:? – Anderson

+0

是的。 (。)*表示全部。 \: - >最後一列\ s?如果有空間,它將被刪除。否則不行動。 –

+1

什麼是量化羣體,爲什麼不只是'。*' –

1

您可使用的兩種解決方案:

這人會匹配到最後:和0後搶位+空格:

var s = "foo: 21, bar: 11"; 
 
var m = s.match(/.*:\s*(\d+)/); 
 
if (m !== null) { 
 
    console.log(m[1]); 
 
}

而這其中會發現一個:隨後與0+空格,然後將捕獲1+位到第1組,然後將匹配0+比:其他字符最多字符串的結尾。

var s = "foo: 21, bar: 11"; 
 
m1 = s.match(/:\s*(\d+)[^:]*$/); 
 
if (m1 !== null) { 
 
    console.log(m1[1]); 
 
}

+0

請注意,我假定該字符串始終包含至少一個':',並且只有一個數字塊需要在其後捕獲。 –