【问题标题】:Exclude array of words from regex match in Javascript从Javascript中的正则表达式匹配中排除单词数组
【发布时间】:2016-12-15 09:52:07
【问题描述】:

我有两个变量,一个字符串 [var str] 和一个单词数组 [var exceptions]。我使用以下正则表达式用星号替换每个超过 3 个字母的单词的每个中间字符:

 var edited = str.replace(/\B\w\B/g, '*');

例如,字符串 "This is an example of what I am doing" 将返回为 "T**s is an e*****e of w* *t 我是 d***g".

但是,我想为这个正则表达式添加例外。例如,给定数组 (var exceptions = ["example","doing"]),然后我希望正则表达式返回:"T**s is an example of w**t I am doing"

有人知道怎么做吗?如果有办法使用正则表达式实现这一点,如果没有,我愿意接受其他建议。

非常感谢:)

【问题讨论】:

    标签: javascript arrays regex replace


    【解决方案1】:

    .split(" ") 将句子分成单独的单词。然后对于每个单词,检查它是否在异常数组中,如果不在,只需将其添加到 newString 中而不做任何更改。如果不是,请应用您的正则表达式。

     var newString = "";
     var exceptions = ["test"];
      "this is a test".split(" ").forEach(word =>{
           if(exceptions.includes(word))
             newString += word + " ";
           else
              newString += word.replace(/\B\w\B/g, '*') + " ";
       });
    
    console.log(newString)

    【讨论】:

      【解决方案2】:

      我可能会将排除数组转换为映射,以便更快地检查单词是否在数组中。然后我会使用 replace 函数接受替换函数的事实,并在那里做出决定:

      var exclude = ["example", "what"];
      var str = "This is an example of what I am doing";
      
      var map = Object.create(null);
      exclude.forEach(function(entry) {
        map[entry] = true;
      });
      var edited = str.replace(/\b(\w)(\w+)(\w)\b/g, function(m, c0, c1, c2) {
        return map[m] ? m : c0 + "*".repeat(c1.length) + c2;
      });
      console.log(edited);

      我在上面使用了String#repeat,它来自 ES2015,但可以很容易地为旧版浏览器填充。或者改用c1.replace(/./g, "*")


      这是一个 ES2015+ 版本,使用 Set 而不是对象映射:

      let exclude = ["example", "what"];
      let str = "This is an example of what I am doing";
      
      let set = new Set();
      exclude.forEach(entry => {
        set.add(entry);
      });
      let edited = str.replace(/\b(\w)(\w+)(\w)\b/g, (m, c0, c1, c2) =>
        set.has(m) ? m : c0 + "*".repeat(c1.length) + c2
      );
      console.log(edited);

      【讨论】:

        【解决方案3】:

        你可以这样做,假设单词总是用空格分隔:

        var str = "This is an example of what I am doing";
        var exceptions = [ "example", "doing" ];
        
        var edited = str.split(' ').map(function(w) {
          return exceptions.indexOf(w) != -1 ? w : w.replace(/\B\w\B/g, '*');
        }).join(' ');
        
        console.log(edited);

        【讨论】:

          【解决方案4】:

          您可以使用例外词 - 我看到它们都由单词字符组成 - 作为交替组并将其捕获到组 1 中,然后在 replace 回调中恢复它们。

          正则表达式看起来像

          /\b(example|doing)\b|\B\w\B/g
          

          查看 JS 演示:

          var exceptions = ["example","doing"];
          var rx = new RegExp("\\b(" + exceptions.join("|") + ")\\b|\\B\\w\\B", "g");
          var s = "This is an example of what I am doing";
          var res = s.replace(rx, function ($0, $1) {
            return $1 ? $1 : '*';
          });
          console.log(res);

          模式详情

          • \b(example|doing)\b - 匹配整个单词 exampledoing 并放入捕获组 #1 以便稍后在结果中恢复
          • | - 或
          • \B\w\B - 匹配其他单词字符中的单词字符(来自[a-zA-Z0-9_] 集合)。

          【讨论】:

            猜你喜欢
            • 2020-09-16
            • 1970-01-01
            • 1970-01-01
            • 2016-05-06
            • 1970-01-01
            • 2011-09-20
            • 1970-01-01
            • 1970-01-01
            • 2012-10-05
            相关资源
            最近更新 更多