2016-10-27 77 views
1

我想創建一個正則表達式,它可以從只包含字母數字字符的給定字符串中提取所有單詞。應該已被提取用Javascript的正則表達式匹配整個單詞有一些限制

Yes 
yes absolutely 
#no 
*NotThis 
orThis-- 
Good *Bad* 
1ThisIsOkay2 ButNotThis2) 

詞:是的,是的,絕對的,好,1ThisIsOkay2

Here是迄今爲止我所做的工作:

/(?:^|\b)[a-zA-Z0-9]+(?=\b|$)/g 

我發現this表達式在Ruby中工作(有一些調整),但我還沒有能夠將其轉換爲Javascript正則表達式。

+0

一個簡單的正則表達式可以用['(?<!\ S)\ w +(?!\ S)'](https://regex101.com/r/Zjn1Ka/2)。它的麻煩是有一個後視(JS不支持)。 – 4castle

+0

'\ b'匹配單詞字符'[a-zA-Z0-9_]'和非單詞字符**或**字符串的限制。所以寫作'(?:^ | \ b)[a-zA-Z0-9] +(?= \ b | $)'與寫作'\ b [a-zA-Z0-9] + \ B' –

回答

1

使用/(?:^|\s)\w+(?!\S)/g在串/空白的開始和字符串的另一個空白或端之間匹配1個或多個單詞字符:

var s = "Yes\nyes absolutely\n#no\n*NotThis\norThis-- \nGood *Bad*\n1ThisIsOkay2 ButNotThis2)"; 
 
var re = /(?:^|\s)\w+(?!\S)/g; 
 
var res = s.match(re).map(function(m) { 
 
    return m.trim(); 
 
}); 
 
console.log(res);

或者另一種變化:

var s = "Yes\nyes absolutely\n#no\n*NotThis\norThis-- \nGood *Bad*\n1ThisIsOkay2 ButNotThis2)"; 
 
var re = /(?:^|\s)(\w+)(?!\S)/g; 
 
var res = []; 
 
while ((m=re.exec(s)) !== null) { 
 
    res.push(m[1]); 
 
} 
 
console.log(res);

圖案的詳細資料

  • (?:^|\s) - 串或空白的任一開始(消耗的,這就是爲什麼trim()是必要的,片段1)
  • \w+ - 1以上字字符(在片段2,捕獲到第1組中,用於填充生成的數組)
  • (?!\S) - 如果字符字符後面沒有非空白字符,則反向預測未能匹配。
1

你可以做到這一點(其中s是你的字符串)匹配所有的話:如果你想繼續更換

var m = s.split(/\s+/).filter(function(i) { return !/\W/.test(i); }); 

,你可以這樣做:

var res = s.split(/(\s+)/).map(function(i) { return i.replace(/^\w+$/, "@");}).join(''); 
相關問題