2012-09-08 158 views
3

我已經難倒位在這一個 - 我有一個字符串,它幾乎是一個分號分隔的字符串,它會是這樣的:的JavaScript /正則表達式忽略分號在雙引號

之一;二;三「四,五,六」; 7

我想在javascript使用一個正則表達式拆分此成像這樣的陣列(例如忽略雙引號內的任何分號):

[「一個」,「2」, 'three'four,five,6'','seven']

我試過調整已知的工作CSV函數,但他們似乎能夠適應與第三個元素('三'四日;五類;六個一「;')。

這似乎是一個正則表達式類型的問題,但如果一個解決方案存在使用比正則表達式,我肯定有興趣!

更新:我還應該注意,引號字符串中分號之前或之後可能有空格。我已經更新了這個例子來反映這一點。

回答

2

假設你不要讓你的引號內的轉義引號(如"this has \"escaped quotes\" inside"),那麼這應該工作:

var rx = /(?!;|$)[^;"]*(("[^"]*")[^;"]*)*/g; 
var str = 'one; two; three "four;five;six"; seven'; 
var res = str.match(rx) 
// res = ['one', ' two', ' three "four;five;six"', ' seven'] 

請注意,您所需要的negative-lookahead(?!;|$)在正則表達式的開頭,以保持它的匹配空字符串,否則由於某種原因,match方法會匹配每個分號前面的空字符串。

更新:

我想這正則表達式應與轉義引號以及工作(雖然我會很感激的正確性反饋)。我還在前面的分號後加上了額外的\s以消除空格。

/(?!\s|;|$)[^;"]*("(\\.|[^\\"])*"[^;"]*)*/g 
+0

真棒,作品魅力! – stockholmux

+0

這太棒了!我怎樣才能得到這個'和'兩個' var str ='one; two; three「four; five; six」; seven'; var str2 =「one;二;三'四,五,六'; 7「; – marknadal

+2

@marknadal - 它看起來像你想讓這也適用於單引號字符串。在這種情況下,試試這個:['(?!\ s |; | $)(?:[^;'' ] *(?: 「(?:\\ | [^ \\」])*「| '(?:\\ | [^ \\'])*'))*'](HTTP:/? /www.rexfiddle.net/08JT1bK) – DaoWen

0

此之前和之後的分號去掉空格:

'one; two; three "four;five;six"; seven'.match(/(?!;| |$)([^";]*"[^"]*")*([^";]*[^ ";])?/g) 

['one', 'two', 'three";four;five;six"', 'seven'] 

'one ; two"; three ; "four" ; five ; "six ; seven'.match(/(?!;| |$)([^";]*"[^"]*")*([^";]*[^ ";])?/g) 

['one', 'two" ; three ; "four" ; five ; "six', 'seven'] 

它不會嘗試,雖然處理轉義引號。

相關問題