2010-12-14 40 views
1

我想知道最後一個記號是否存在具有某種程度上,這正則表達式找到一個字符串

var string = "foo::bar" 

爲了獲取字符串的最後部分:使用正則表達式只是"bar"

我試圖做前瞻,但不能掌握足夠的這樣做。

-

UPDATE

也許一些例子會使問題更加清晰。

var st1 = "foo::bar::0" 
match should be 0 

var st2 = "foo::bar::0-3aab" 
match should be 0-3aab 

var st3 = "foo" 
no match should be found 
+0

作爲分隔符,我想以後什麼都有最後一個'::'部分,可以是在'::'之後,我有任何其他類型的符號,數字等。 – jpabluz 2010-12-14 20:34:08

+0

最後一個標記可以包含':'嗎?如果是這樣,它可以是'foo :::bar',你將如何處理它? – Kobi 2010-12-14 21:08:22

回答

8

可以使用負前瞻:

/::(?!.*::)(.*)$/ 

結果將隨後在捕獲。

另一種方法:

/^.*::(.*)$/ 

這應該工作,因爲.*比賽貪婪,所以::將匹配最後 occurence該字符串的。

+0

如果您有空格結尾,或者可能有或者沒有尾隨空格,請嘗試使用「\\ w + \\ s * $」。 – 2010-12-14 20:33:27

+0

這不適用於我的示例,它將在第一個示例中匹配「bar :: 0」。 – jpabluz 2010-12-14 20:50:09

+0

這不會起作用 - '*'是貪婪的,例如,它會匹配'foo :: bar :: 0-3aab'中的'bar :: 0-3aab'。 – 2010-12-14 20:50:33

2

簡單,

/::(.+)$/ 

,除非你知道你想要完全是一個字符串多久才能匹配您不能使用向前看符號。幸運的是,這不是問題,因爲您只查看字符串$的末尾。

+0

這不適用於我的例子,它會匹配第一個例子中的「bar :: 0」。 – jpabluz 2010-12-14 20:49:03

+0

這不會起作用 - '+'是貪婪的,例如,它會匹配'foo :: bar :: 0-3aab'中的'bar :: 0-3aab'。 – 2010-12-14 20:50:51

+0

對不起,它仍然不起作用,但不是因爲我說的原因。 – 2010-12-14 21:05:12

0
var string2 = string.replace(/.*::/, ""); 

雖然也許string是不是你的字符串的名稱的最佳選擇?

+0

哈哈是的,這個名字只是爲了說明目的。 =) – jpabluz 2010-12-14 20:40:05

1

我不會使用這個正則表達式(雖然你當然可以);我想把這個字符串拆分爲::,因爲這在概念上就是你想要做的。

function lastToken(str) { 
    var xs = str.split('::'); 
    return xs.length > 1 ? xs.pop() : null; 
} 

如果你真的想要一個正則表達式,你可以使用/::((?:[^:]|:(?!:))*)$/。首先,它匹配文字::。然後,我們使用圓括號將所需的東西放入第1組中。所需的是一個或多個(?:...)包圍字符串的副本;這個包圍組沒有捕獲。然後,我們查找非冒號字符[^:]或冒號後跟非冒號的:(?!:)(?!...)是負向前視,僅當下一個標記不與匹配所包含的模式時才匹配。由於JavaScript不支持負lookbehinds,我看不到一個很好的方式,以避免捕捉::爲好,但你可以在一個函數把這個包:

function lastTokenRegex(str) { 
    var m = str.match(/::((?:[^:]|:(?!:))*)$/); 
    return m && m[1]; 
} 
相關問題