关于javascript:如何使用REGEX替换除引用文本之外的整个文本中的某些符号

How to replace certain symbols from the whole text except quoted text with REGEX

我有一个这样的变量text

"lorem ipsum dolor sit amet;consetetur sadipscing eliter;sed diam nonumy eirmod tempor"invidunt;ut labure"et dolore magna aliquyam erat/sed diam voluptua."

我要做的是替换数组中的所有符号:

1
var symbolsToreplace = [';', '/', '.']

逗号。另外,我想做的是不要替换引号内的任何内容,因此所有符号保持不变。以下是用于检测引号的regex:

1
var detectQuotes = /"([^"]*)"/g;

目前,我已经完成了任务的一部分(这里我将数组中的所有符号替换为','):

1
2
3
4
5
  symbolsToreplace.map(function (s) {
    if(text.indexOf(s) !== -1 ) {
      text.replace(s, ',');
    }
  })

如何应用regex detectQuotes,以便忽略引号中的三个符号?


您可以用双引号拆分文本,然后仅对奇数片段应用替换,然后连接结果:

1
2
3
4
5
6
7
8
9
10
11
12
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);


您可以将replace方法与regex一起使用,regex将捕获双引号之间的子字符串,并且只匹配要替换的字符,然后检查匿名方法内部,如果组1匹配,如果是,则还原匹配,否则将其替换为逗号:

1
2
3
4
5
6
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中,然后与"匹配。
  • |—或
  • [;.\/]-a ;./字符
  • function($0,$1) { return $1 ? $0 : ',';}—将整个匹配分配给$0,将捕获的子字符串分配给$1。如果$1不为空,则更换为全匹配,否则更换为,