Javascript正则表达式任意位置的可选字符,并以特定字符

时间:2017-07-26 16:48:22

标签: javascript regex replace match

我需要在文档中的任何位置找到并更改给定的字符串。我可以分别处理两个条件,但无法一起工作。

  1. 单词有时会与-\n划分,并且应始终匹配。
  2. 如果字符串的边界不是字母数字或连字符,则只能匹配字符串。
  3. 假设我想用<stuff>标记包装匹配的文本。对于第一个,我有以下感觉丑陋但有效。我在每个单词的每个字符之间插入一个可选的-\n组。

    function createMask(term){
        var words = term.split(' ');
        new_words = [];
        for(i=0; i<words.length; i++){
            var word = words[i].split('').join('(\\-\\n)?');
            new_words.push(word);
        }
      var mask = new_words.join('\\s'); \\Any space is ok here.
      return mask;
    }
    var doc = 'This is sand, and rand,\nand something else a-\nn-\nd ';
    var mask = createMask('and');
    var newDoc = doc.replace(RegExp(mask, 'ig'), '<stuff>$&</stuff>');
    

    这匹配最后一个&#39;和&#39;还有“沙子”里面的那些并且&#39;兰德&#39;

    对于第二个我可以做以下

    function createMask(term){
      var mask = '([^a-zA-Z0-9-])(' + term + ')([^a-zA-Z0-9-])';
      return mask;
    }
    var doc = 'This is sand, and rand,\nand something else a-\nn-\nd ';
    var mask = createMask('and');
    var newDoc = doc.replace(RegExp(mask, 'ig'), '$1<stuff>$2</stuff>$3');
    

    将表达式组合在一起的工作除了捕获组错误之外。我尝试将(\\-\\n)?切换为(?:\\-\\n),但后来无法匹配任何内容。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

你最想要一个单词边界\b。您还可以将代码缩短为这两行代码段:

var text = 'This is sand, and dand rand,\nand something else a-\nn-\nd dand';
var words = 'and dand'
console.log(text.replace(RegExp('\\b' + words.replace(/\B|(\S)\b/g, '$1(?:-\\n)?').replace(/\s/g, '\\s') + '\\b', 'ig'), '<stuff>$&</stuff>'))