只替换整个单词,而不是单词

时间:2014-12-14 17:34:28

标签: javascript regex replace

我试图仅替换整个单词,但我的脚本替换了该单词的所有区分大小写的实例。这是我的代码:

<script>

function repl() {

var lyrics = document.getElementById('Lyricstuff').value;
var find = document.getElementById('rs1').innerHTML;
var spantag = document.getElementById('rt1').innerHTML;
var regex = new RegExp(find, "g");

document.getElementById('Results').value = lyrics.replace(regex, spantag) ;

}

</script>
<textarea id="Lyricstuff" cols="60" rows="10">C CAT cat</textarea>
 <button onclick="repl()">Replace</button>
<textarea id="Results" cols="60" rows="10"></textarea>
<span id="rt1">B</span><span id="rs1">C</span>

在上面的示例中,结果显示为&#34; B BAT cat&#34;,但我期待的是&#34; B CAT cat&#34;。我搜索过这个问题并且找不到任何相关内容。

有人可以帮帮我吗?任何帮助表示赞赏。

我在这里添加了一个小提琴:http://jsfiddle.net/1z8f7b23/

1 个答案:

答案 0 :(得分:12)

如果您只想搜索整个单词,可以用\b个锚点(单词边界)包围搜索表达式。

单词边界是\w和[\W之间或字符串的开头/结尾]之间的任何位置。也就是说,它匹配一个字符匹配[a-zA-Z0-9_]但另一个字符不匹配的字符。

&#13;
&#13;
function repl() {
  var lyrics = document.getElementById('Lyricstuff').value;
  var find = document.getElementById('rs1').innerHTML;
  var spantag = document.getElementById('rt1').innerHTML;
  var regex = new RegExp('\\b' + find + '\\b', "g");

  document.getElementById('Results').value = lyrics.replace(regex, spantag) ;
}
&#13;
<textarea id="Lyricstuff" cols="60" rows="4">C CAT cat</textarea>
<button onclick="repl()">Replace</button>
<textarea id="Results" cols="60" rows="4"></textarea>
<span id="rt1">B</span><span id="rs1">C</span>
&#13;
&#13;
&#13;


如果您要替换C#,则不能再使用\b,因为#字符不在\w中。您必须提供自己的断言版本。这对于单词的结尾是直截了当的,但是由于JS不支持lookbehinds,所以不是单词的开头。所以你必须使用一种解决方法:

  • 在单词末尾使用(?=\s|$)代替\b
  • 在单词的开头使用(\s|^),但您必须将其保留在替换中。 (?<=\s|^)看起来更容易,但JS中不支持它。
  • 此外,最好将模板封装在(?: ... )组中。
  • 如果您的搜索模式不是正则表达式,请务必使用

    进行转义
    find = find.replace(/[-\\()\[\]{}^$*+.?|]/g, '\\$&');
    

    否则,C$等搜索字符串将无法匹配。

&#13;
&#13;
function repl() {
  var lyrics = document.getElementById('Lyricstuff').value;
  var find = document.getElementById('rs1').value;
  var spantag = document.getElementById('rt1').value;

  // I don't know if you want this or not...
  find = find.replace(/[-\\()\[\]{}^$*+.?|]/g, '\\$&');

  var regex = new RegExp('(\\s|^)(?:' + find + ')(?=\\s|$)', "g");

  document.getElementById('Results').value = lyrics.replace(regex, "$1" + spantag);
}
&#13;
<textarea id="Lyricstuff" cols="60" rows="4">This is C# and this is C#m</textarea>
<button onclick="repl()">Replace</button>
<textarea id="Results" cols="60" rows="4"></textarea><br/>
<input id="rs1" value="C#"/><input id="rt1" value="1"/>
&#13;
&#13;
&#13;