我试图仅替换整个单词,但我的脚本替换了该单词的所有区分大小写的实例。这是我的代码:
<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/
答案 0 :(得分:12)
如果您只想搜索整个单词,可以用\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) ;
}
&#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;
如果您要替换C#
,则不能再使用\b
,因为#
字符不在\w
中。您必须提供自己的断言版本。这对于单词的结尾是直截了当的,但是由于JS不支持lookbehinds,所以不是单词的开头。所以你必须使用一种解决方法:
(?=\s|$)
代替\b
。(\s|^)
,但您必须将其保留在替换中。 (?<=\s|^)
看起来更容易,但JS中不支持它。(?:
... )
组中。如果您的搜索模式不是正则表达式,请务必使用
进行转义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);
}
&#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;