我有一个变量text
,如下所示:
“Lorem ipsum dolor sit amet; consetetur sadipscing elitr; sed diam nonumy eirmod tempor ”invidunt; ut labore“ et dolore magna aliquyam erat / sed diam voluptua。”
我想要做的是替换数组中的所有符号:
var symbolsToreplace = [';', '/', '.']
逗号。另外我想做的是不要替换引号内的任何内容,因此所有符号都保持不变。 这是Regex检测报价:
var detectQuotes = /"([^"]*)"/g;
现在我已经完成了任务的一部分(这里我将数组中的所有符号替换为','):
symbolsToreplace.map(function (s) {
if(text.indexOf(s) !== -1 ) {
text.replace(s, ',');
}
})
我如何应用正则表达式detectQuotes
,因此引号内的三位符号将被忽略?
答案 0 :(得分:2)
你可以用双引号分割文本,然后仅对奇数片段应用替换,然后连接结果:
var text = "Lorem ipsum dolor sit amet; consetetur sadipscing elitr; sed diam nonumy eirmod tempor \"invidunt; ut labore\" et dolore magna aliquyam erat/ sed diam voluptua.";
var delimiters = ';./',
template = new RegExp('[' + delimiters + ']','g')
var replaced = text
.split('"')
.reduce(function(previous, current, index) {
current = (index % 2 === 0) ? current.replace(template, ',') : current;
return previous + '"' + current;
}, '');
console.log(replaced);

答案 1 :(得分:0)
您可以在正则表达式中使用replace
方法捕获双引号之间的子字符串,只匹配要替换的字符,然后在组1匹配时检查匿名方法,如果是,则还原匹配,否则,用逗号替换它:
var s = 'Lorem ipsum dolor sit amet; consetetur sadipscing elitr; sed diam nonumy eirmod tempor "invidunt; ut labore" et dolore magna aliquyam erat/ sed diam voluptua.';
console.log(
s.replace(/"([^"]+)"|[;.\/]/g, function($0,$1) { return $1 ? $0 : ',';})
// ES6:
//s.replace(/"([^"]+)"|[;.\/]/g, ($0,$1) => $1 ? $0 : ',')
);

<强>详情
"([^"]+)"
- 匹配"
,然后将"
以外的任何一个或多个字符捕获到第1组,然后匹配"
|
- 或[;.\/]
- ;
,.
或/
字符function($0,$1) { return $1 ? $0 : ',';}
- 将整个匹配分配给$0
,将捕获的子字符串分配给$1
。如果$1
不为空,则替换为整个匹配,否则请替换为,
。