2014-09-19 128 views
1

我有一個字符串,它可以是\w一個逗號分隔的列表,如:我想正則表達式捕捉到逗號分隔值

  • ABC123
  • ABC123,def456,ghi789

找到將返回['abc123'](第一種情況)或['abc123', 'def456', 'ghi789'](不含逗號)的JavaScript正則表達式。

我想:

  • ^(\w+,?)+$ - 不,因爲只有最後的重複模式將被匹配,789
  • ^(?:(\w+),?)+$ - 同樣的故事。我正在使用非捕獲括號。然而,捕獲只是似乎沒有發生的重複字

是我試圖甚至可能與正則表達式?我試過幾乎分組的每個組合,使用捕捉和非捕獲括號,但仍不能設法讓這種情況發生......

+0

'string.split(',')'有什麼問題? – elclanrs 2014-09-19 02:22:49

+0

它將根據','分割,而我想檢查匹配是否符合\ w – Merc 2014-09-19 02:38:04

+0

'= badstuff,goodstuff'的預期輸出是什麼?你是否必須用逗號分隔值來處理轉義機制? – nhahtdh 2014-09-19 03:44:15

回答

0

做錯事,最簡單的方法是驗證,然後分裂:

if (/^\w+(,\w+)*$/.test(input)) { 
    var values = input.split(','); 

    // Process the values here 
} 

如果你想允許空值,改變\w+\w*

嘗試使用單個正則表達式同時匹配和驗證要求仿效\G特徵,該特徵確定了上次匹配的位置。爲什麼需要\G?因爲它阻止引擎在下一個位置重試匹配並繞過驗證。記住比ECMA腳本的正則表達式沒有向後看,所以你不能後無效字符的位置和字符(S)區分:

something,=bad,orisit,cor&rupt 
      ^^    ^^ 

當你不能區分2個職位,你不能依賴引擎來單獨完成全部匹配操作。儘管可以使用RegExp.exec的while循環並自行聲明最後匹配的位置,但爲什麼在有更清晰的選項時這麼做呢?


如果你想野蠻的可用,torazaburo's answer是一個可行的選擇。

0

Live demo

試試這個正則表達式:

'/([^,]+)/' 

或者,javascript中的字符串具有拆分方法,可以基於分隔符拆分字符串:

s.split(',') 
+0

我的天啊,我真是個白癡。謝謝... – Merc 2014-09-19 02:27:47

+0

不,它發生了,歡迎你:) @Merc – CMPS 2014-09-19 02:29:45

+0

我實際上想匹配\ w具體。所以,我想出了([\ w] *,?)(這也不會強迫我在最後)。聽起來不錯? – Merc 2014-09-19 02:30:28

-1

可能是你可以使用在逗號第一分割功能

var st = "abc123,def456,ghi789"; 
var res = st.split(','); 
0

拆分,然後過濾掉不匹配的結果:如果你要放棄整個輸入時有

str.split(',').filter(function(s) { return /^\w+$/.test(s); }) 
0

這個正則表達式分隔新行中的數值,其中包含特殊字符,如.,,,#等。

var val = [1234,1213.1212, 1.3, 1.4] 
var re = /[0-9]*[0-9]/gi; 
+0

你回答什麼問題? – Toto 2017-12-19 11:05:12

0

var str = "abc123,def456, asda12, 1a2ass, yy8,ghi789"; 
 
var re = /[a-z]{3}\d{3}/g; 
 
var list = str.match(re); 
 
document.write("<BR> list.length: " + list.length); 
 
for(var i=0; i < list.length; i++) { 
 
\t document.write("<BR>list(" + i + "): " + list[i]); 
 
}

這將讓在列表中,並沒有別的只有 「ABC123」 代碼風格。