2013-10-31 78 views
1

是否有任何方法可以捕獲和替換引號中包含的字符串中的所有逗號,而不是引號外的任何逗號。我想改變他們的管道,然而這:替換帶引號的字符串中的所有逗號

/("(.*?)?,(.*?)")/gm

僅獲得第一個實例:

JSBIN

+0

你能給我們一些「之前和之後」的字符串,以便我們確定情況嗎?例如,字符串中是否可以有多個雙引號對,如果是這樣,它是否應該替換所有這些對中的逗號? – talemyn

+0

@talemyn是的,那是真的。可能有多個帶引號的字符串。 – 1252748

回答

5

如果回調是好的,你可以去這樣的事情:

var str = '"test, test2, & test3",1324,,,,http://www.asdf.com'; 

var result = str.replace(/"[^"]+"/g, function (match) { 
    return match.replace(/,/g, '|'); 
}); 

console.log(result); 
//"test| test2| & test3",1324,,,,http://www.asdf.com 
+0

是可以使用'exec()'來實現這個而不是兩個'replace()'。 MDN說我可以用它來對一個字符串運行一個模式多次,但我不明白如何。 – 1252748

+0

@thomas'exec'不會取代任何東西,所以您無論如何都需要這樣做。如果你正在搜索*一個*正則表達式,[這個閱讀](http://stackoverflow.com/questions/4476812/regular-expressions-how-to-replace-a-character-within-quotes?rq=1)可能會幫助你,但是,與PCRE相比,JS知道正常表達式有多糟糕(它缺乏很多向後看和向前看),那麼它可能不起作用。 – h2ooooooo

0

與正則表達式版本相比,這是非常複雜的,但是,我想這樣做,如果只是爲了實驗的目的:

var PEG = require("pegjs"); 

var parser = PEG.buildParser(
    ["start = seq", 
    "delimited = d:[^,\"]* { return d; }", 
    "quoted = q:[^\"]* { return q; }", 
    "quote = q:[\"] { return q; }", 
    "comma = c:[,] { return ''; }", 
    "dseq = delimited comma dseq/delimited", 
    "string = quote dseq quote", 
    "seq = quoted string seq/quoted quote? quoted?"].join("\n") 
); 

function flatten(array) { 
    return (array instanceof Array) ? 
     [].concat.apply([], array.map(flatten)) : 
     array; 
} 

flatten(parser.parse('foo "bar,bur,ber" baz "bbbr" "blerh')).join(""); 
// 'foo "barburber" baz "bbbr" "blerh' 

我不建議你這樣做在這種特殊情況下,但也許它會創造出一些興趣:)

PS。 pegjs可以在這裏找到:(我不是一個作者,也沒有從屬關係,我只是喜歡PEG)http://pegjs.majda.cz/documentation