仅替换整个单词,而不替换单词

2024-03-30

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

<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>

在上面的示例中,结果显示为“B BAT cat”,但我期望的是“B CAT cat”。我搜索过这个问题,但找不到任何相关内容。

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

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


如果您只想搜索整个单词,您可以将搜索表达式括起来\b锚点(单词边界)。

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

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) ;
}
<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>

如果你想更换C#,你不能使用\b不再是因为#角色不在\w。您必须提供您自己的断言版本。对于单词结尾来说这很简单,但对于单词开头则不然,因为 JS 不支持lookbehinds。所以你必须使用一个解决方法:

  • Use (?=\s|$)代替\b在单词的末尾。
  • Use (\s|^)位于单词的开头,但您必须将其保留在替换中。如果有的话,这会更容易(?<=\s|^)Lookbehind 但 JS 不支持。
  • 另外,最好将模式封装在(?:...) group.
  • 如果您的搜索模式不是正则表达式,请确保使用转义

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

    否则搜索字符串,例如C$不匹配。

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);
}
<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"/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅替换整个单词,而不替换单词 的相关文章