如何用REGEX中的引用文本替换整个文本中的某些符号

时间:2018-06-17 11:25:39

标签: javascript regex

我有一个变量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,因此引号内的三位符号将被忽略?

2 个答案:

答案 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不为空,则替换为整个匹配,否则请替换为,