【问题标题】:How to get unmatched keywords?如何获得不匹配的关键字?
【发布时间】:2012-10-26 11:11:20
【问题描述】:

我用这个作为关键字s='young girl jumping'

function selfreplace(s) {
    var words = ['man', 'jumping'];
    var re = new RegExp('\\b(' + words.join('|') + ')\\b', 'g');
    var specials = [];
    var match;
    var str = "";
    while(match = re.exec(s)) {
        str += match[0] + '(k)';
    }
    return str;
}

它正在返回jumping(k)

我希望结果是young(s) girl(s) jumping(k)

【问题讨论】:

  • 我猜你的意思是words.join而不是cities.join
  • 所以您希望与您的正则表达式匹配的单词返回yourword(k) 而与yourotherword(s) 不匹配的单词?
  • @MarkWalters 是的,我确实想要那个......

标签: javascript jquery keyword-search


【解决方案1】:

检查它是否在正则表达式之外的words 中可能是最简单的:

function selfreplace(s) {
   var words = ['man','jumping'];
   var re = new RegExp('\\b(\\w+)\\b', 'g');   
   var specials = [];
   var match;
   var str = "";
   while(match = re.exec(s))
   {
       if (words.indexOf(match[0]) !== -1))
           str += match[0] + '(k)';
       else
           str += match[0] + '(s)';
   }    
   return str;

}

【讨论】:

  • 你在哪里运行这个?有Array.indexOf吗?如果没有,您将不得不以不同的方式检查它。该行所做的只是检查match[0] 中的字符串是否包含在words 中。您可以通过循环轻松做到这一点。
  • (我没疯,OP删除了他的评论:P)
【解决方案2】:

您可以使用回调替换。

function selfreplace(s){
  return s.replace(/man|jumping|(\w+)/g, function(word, misc){
    return word + (misc? '(s)' : '(k)')
  })
}

如果匹配的单词是manjumping,则只设置第一个参数(整个匹配)。如果匹配的单词是其他单词,则也设置第一个捕获组。

如果您不知道前面的单词集,您仍然可以即时生成正则表达式。假设words 不包含非单词字符:

function selfreplace(s, words){ //or any other method of passing 'words'
  var re = RegExp(words.join("|")+"|(\\w+)",'g');
  return s.replace(re, function(word, misc){
    return word + (misc? '(s)' : '(k)')
  })
}

【讨论】:

    【解决方案3】:

    只是一种不同的方法,可能不是最好的解决方案,但我想我会把它扔在那里。

    var str = "young girl jumping";
    
    function replaceStr(s){
    
        var matched = new RegExp("man|jumping", "i");
        var newStr = "";
        var str = s.split(" ");
        for(var i=0; i<str.length;i++){
            if(str[i].match(matched)){
                newStr += str[i]+"(k) ";
            } else {
                newStr += str[i]+"(s) ";
            }
        }
        return newStr.substr(0, newStr.length-1); 
    }
    
    //replaceStr(str) returns "young(s) girl(s) jumping(k)"
    

    DEMO这里

    如果匹配的单词可能发生变化,那么您可以随时修改此函数,使其接受一个数组作为第二个参数,然后动态创建正则表达式

    replaceStr(s, matchArr){}var matched = new RegExp("("+matchArr.join("|")+")", "i");

    【讨论】:

      【解决方案4】:

      这样的事情可能会给你一个提示:

      var s = "young girl jumping",
          words = ['man','jumping'],
          regex = new RegExp("(" + words.join("|") +")", "g"),
          q = s.replace(regex, function( string ) {
              return string + "(k)";
          });
      
      console.log(q); // "young girl jumping(k)"
      

      【讨论】:

      • 问题是如何处理不匹配的单词。
      【解决方案5】:

      如果你只匹配单词,你真的不需要正则表达式,对吗?

      只查找带有 == 的单词怎么样

      function selfreplace(s) {
          var words = ['man','jumping'];
          var input = s.split(" ");
          var str = "";
          for(var i=0; i<input.length; i++){
              var tmpString = "(s)";
              for(var j=0; j<words.length; j++){
                  if(input[i] == words[j]){
                      tmpString = "(k)";
                  }
              }
              str += input[i]+tmpString;
          }
          return str;
      }
      

      【讨论】:

        【解决方案6】:

        您可以为此使用RegExp,但对于您正在做的事情,RegExp 是多余的。我会改用Array 方法:

        var selfreplace = function selfreplace(s) {
            var words = ['man', 'jumping'],
                i = 0,
                suffix = '(s)';
            s = s.split(' ');
            for (i = 0; i < s.length; i += 1) {
                if (words.indexOf(s[i]) > -1) {
                    s[i] = s[i] + '(k)';
                } else {
                    s[i] = s[i] + '(s)';
                }
            }
            return s.join(' ');
        };
        

        这是一个实际操作:http://jsfiddle.net/4KAzw/

        【讨论】:

          猜你喜欢
          • 2022-12-04
          • 1970-01-01
          • 1970-01-01
          • 2013-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-01
          相关资源
          最近更新 更多