2014-02-11 45 views
1

所以,我目前在字符串中的最後一個空間及其以下單詞匹配這個正則表達式:正則表達式符合以下

var regex = /\s+\S*$/m 

例如:

'this match'.match(regex) == [" match"] 

但是,如果整個字符串只是一個空白字符,然後是字符,它仍然會匹配。 (如' match'

我與"not followed by" quantifier嘗試,但我來最接近一直以配合我的首選輸出的倒數:

var regex = /\S+(?=\s+\S*$)/m 
'this match'.match(regex) == ["this"] 

我想這只是比賽一個空格,然後如果那場比賽後跟任意數量的單詞字符

一句話所以,我想它的這個最後空間和字匹配:'multiple words'

但不能匹配這個根本:​​

編輯:我要補充一點,我打算使用搜索()方法(或東西可比)在比賽開始時得到字符的索引。我僅使用上面的match()方法進行說明。

回答

2

你可以使用這樣的事情:

/.(\s\w+)/ 

這將匹配任何字符後跟一個空白字符,後跟一個或多個單詞字符,在組1捕獲,然後你只需要提取組。例如:

'multiple words'.match(/.(\s\w+)/)[1] // " words" 
' word'.match(/.(\s\w+)/)    // null 

請注意,我在這個模式中使用.因爲這個問題有點不清楚你想要比賽是什麼,理由是隻有「只是一個空格字符,然後單詞字符」。如果你想確保有捕獲的組前面的一些字的字符,使用這樣的:

/\w\s*(\s\w+)/ 

要獲得使用第一圖案的第一場比賽的指標是很容易的。只需使用search,並添加1:

'multiple words'.search(/.(\s\w+)/) + 1 // 8 
' word'.match(/.(\s\w+)/) + 1   // 0 (not found) 

但如果你使用第二圖案,這是一個很大的難度。 JavaScript沒有提供簡單的方法來獲取每個捕獲組的位置。你能做的最好是用exec這將給你捕獲組其中找到匹配,那麼這樣做索引:

match = /\w\s*(\s\w+)/.exec('multiple words'); 
index = match.index + match[0].length - match[1].length; // 8 

match = /\w\s*(\s\w+)/.exec(' words');     // undefined 
+1

我會用'\ S'而不是' .'所以它不能匹配像'word'這樣的兩個主要空格。 – Vache

+0

我在原始文章中添加了一條編輯。你給我的東西可以(幸運地)讓我到那裏,但它需要額外的步驟從原始字符串的長度減去match [1]值的長度以獲得索引。有沒有辦法使這個輸出與字符串一起使用時所需的匹配索引。search()方法? –

+0

@dom請參閱我更新的答案,瞭解一些替代方案。 –