【问题标题】:How do I match a word that has non-word characters?如何匹配包含非单词字符的单词?
【发布时间】:2012-02-28 22:30:48
【问题描述】:

我正在替换字符串中的单词,并尝试根据 '\b' + myword + '\b' 进行匹配 但是,当myword 两端都有非单词字符时,这不起作用。

var myword1 = "testword,";
var myword2 = "(testword";
var testString = "<tag>asdftestword, is a (testwordasdf also (testword </tag> (testword, should be replaced everywhere there is a testword,)";

var rx1 = new RegExp(???(myword1) ,'g');
var rx2 = new RegExp(???(myword2) ,'g');
var result1 = testString.replace(rx1, "replacement");
var result2 = testString.replace(rx2, "replacement");

我希望结果是

result1 == "<tag>asdftestword, is a (testwordasdf also (testword </tag> (replacement should be replaced everywhere there is a replacement)"
result2 == "<tag>asdftestword, is a (testwordasdf also replacement </tag> replacement, should be replaced everywhere there is a testword,)"

【问题讨论】:

标签: javascript regex


【解决方案1】:
testString.replace( new RegExp('\\b'+myword+'\\b','g'), "replacement");

但是,如果myword 可能包含正则表达式中的特殊字符(例如括号、句点、方括号等),那么您需要escape them first

RegExp.escape = function(text) {
  if (!RegExp.sRE) {
    var chars = '/.*+?|()[]{}\\'.split('');
    RegExp.sRE = new RegExp('\\'+chars.join('|\\'), 'g');
  }
  return text.replace(RegExp.sRE, '\\$&');
}

var re = new RegExp('\\b'+RegExp.escape(myword)+'\\b','g');

【讨论】:

    【解决方案2】:

    您不需要正则表达式。只需使用普通字符串替换:

    var myword = "testword,";
    var testString = "<tag>asdftestword, is a testword</tag> (testword, should be replaced everywhere there is a testword,)";
    
    var result = testString.replace( myword , "replacement");
    

    【讨论】:

    • 我需要它忽略 &lt;tag&gt;asdftestword, jsfiddle.net/g4f8s yeilds &lt;tag&gt;asdfreplacement is a testword&lt;/tag&gt; (testword, should be replaced everywhere there is a testword,)
    • JavaScript 的String.prototype.replace 只替换第一次出现;您必须使用带有 /g 标志的正则表达式来替换所有匹配项。 (或者使用其他愚蠢的循环结构。)
    • 用正则表达式全局标志修复var result = testString.replace( /testword,/g , "replacement");
    【解决方案3】:
    var rx = new RegExp('\\b' + myword ,'g');
    var result = testString.replace(rx, 'replacement');
    

    【讨论】:

      【解决方案4】:

      好的,我终于想通了。看起来它太复杂了,只需要一个 RegExp 我需要多个!

      在行动中看到它Here

      function EscapeRegex(text) {
          if (!RegExp.sRE) {
          var chars = '/.*+?|()[]{}\\'.split('');
          RegExp.sRE = new RegExp('\\'+chars.join('|\\'), 'g');
          }
          return text.replace(RegExp.sRE, '\\$&');
      }
      
      function ReplaceWholeWord(subjectString, wordtofind, replacement){
          var escapedWord = EscapeRegex(wordtofind);
          //simplest scenaro, word to find has non-word characters at begining and end - do basic replace
          if(regexIndexOf(escapedWord, '[^\\w]', 0) == 0 && regexLastIndexOf(escapedWord, '[^\\w]', 0) == wordtofind.length - 1){
              subjectString = subjectString.replace(new RegExp(escapedWord, 'g'), replacement);
          }
          //word to find begins with non-wordcharacter
          else if(regexIndexOf(escapedWord, '[^\\w]', 0) == 0){
              var index = regexIndexOf(subjectString, escapedWord+'[^\\w]', index);
              while(index > 0){
                  subjectString = subjectString.substring(0, index) + replacement + subjectString.substring(index + wordtofind.length);
                  index = regexIndexOf(subjectString, escapedWord+'[^\\w]', index);
              }
          }
          //word to find ends with non-wordcharacter
          else if(regexLastIndexOf(escapedWord, '[^\\w]', 0) == wordtofind.length - 1){
              var index = regexIndexOf(subjectString, '[^\\w]'+escapedWord, index);
              while(index > 0){
                  subjectString = subjectString.substring(0, index) + replacement + subjectString.substring(index + myword.length + 1);
                  index = regexIndexOf(subjectString, escapedWord+'[^\\w]', index);
              }
          }
          //word is normal
          else{
              var index = regexIndexOf(subjectString,'[^\\w]'+escapedWord+'[^\\w]', index);
              while(index >= 0){
                  subjectString = subjectString.substring(0, index + 1) + replacement + subjectString.substring(index + wordtofind.length + 1);
                  index = regexIndexOf(subjectString,'[^\\w]'+escapedWord+'[^\\w]', index);
              }
          }
          return subjectString;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        • 2022-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        相关资源
        最近更新 更多