仅替换整个单词,而非单词的部分

4

我试图仅替换整个单词,但是我的脚本会替换所有大小写敏感的单词实例。以下是我的代码:

<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”。我搜索了这个问题,但没有找到相关的信息。
请问有人可以帮助我吗?任何帮助都会得到赞赏。
我在这里提供了一个 jsfiddle 链接:http://jsfiddle.net/1z8f7b23/

1
你的 JS Fiddle 坏了。 - Jay Harris
1
查找单词边界 http://jsfiddle.net/1z8f7b23/1/ - stoppert
这个 [{FullName}] 的正则表达式是什么? - bilal
1个回答

21
如果您只想搜索整个单词,可以使用\b锚点(单词边界)来包围搜索表达式。
单词边界是\w和[\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不支持向前查找。所以你需要使用一个变通方法:
  • Use (?=\s|$) instead of \b at the end of the word.
  • Use (\s|^) at the start of the word but you'll have to keep it in the replacement. This would have been easier with a (?<=\s|^) lookbehind but it's not supported in JS.
  • Also, it's better to enclose the patern in a (?:...) group.
  • If your search pattern is not meant to be a regex, make sure to escape it with

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

    Otherwise search strings like C$ wouldn't match.

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


然而,如果我写C#,似乎会出现错误。我可能使用的唯一额外字符是#号。有没有什么办法解决这个问题? - Sudhin
@Sudhin请发一下你的C#代码(和输入),这样我就能看一看了。 - Lucas Trzesniewski
我一直在测试代码,我认为错误现在已经消失了。我会让你知道进展如何。 - Sudhin
@Sudhin 哦,我误解了你的意思。我以为你想使用来自 C# 的相同正则表达式。我已更新答案。 - Lucas Trzesniewski
这将删除空格尾随,例如在“#test#test#test”中搜索“#test”->结果=>“#replaced#replaced#replaced”。 - Unspeakable
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接