http://jsfiddle.net/bxeLyneu/1/

function custom() {
var str = document.getElementById('original').innerHTML;
var replacement = str.replace(/\B:poop:\B/g,'REPLACED');
document.getElementById('replaced').innerHTML = replacement;
}
custom()


是=:poop:应该替换为“ REPLACED”
No =:poop:不应替换。换句话说,保持原样。

数字4、5、6似乎未遵循所提供的规则。我确实知道为什么,但是我不知道如何将多个表达式组合为一个。
我尝试了许多其他方法,但是我无法让它们按照我希望的方式工作。赔率对我不利。

是的,这与聊天框中的Facebook表情符号的工作原理非常相似。

新问题:



http://jsfiddle.net/xaekh8op/13/

/(^|\s):bin:(\s|$)/gm


它无法扫描并替换中间的一个。
我该如何解决?

最佳答案

\B表示“任何位置都不在单词边界上”,而\s表示“空白”。根据您给出的示例,以下代码可以完美运行。

function custom() {
    var str = document.getElementById('original').innerHTML;
    var replacement = str.replace(/([\s>]|^):poop:(?=[\s<]|$)/gm,'$1REPLACED');
    document.getElementById('replaced').innerHTML = replacement;
}
custom()


http://jsfiddle.net/xaekh8op/15/

说明:

正则表达式([\s>]|^):poop:(?=[\s<]|$)代表以下内容:

 (在Debuggex中创建的图像)

通过在开头选择\s>之一(或使用^表示行的开头),并将其分组为第1组,我们可以在以后使用它。在:poop:之后(\s<或行尾$)类似。但是,第二次使用预查(语法是(?= ...))完成,该检查将检查[\s<]|$部分是否在此之后,但在替换中不会消耗它。 <>照顾可能在:poop:旁边的所有HTML标记。替换字符串$1中的$1REPLACED将第一组放回原位,从而仅呈现:poop:REPLACED替换。第二个“组”只是一个先行,因此不需要替换。

有关单词边界的更多信息,可以参考http://www.regular-expressions.info/wordboundaries.html,其中表示:


  有三个不同的位置可作为单词边界:
  
  
  如果字符串中的第一个字符是单词字符,则在字符串中第一个字符之前。
  如果字符串中的最后一个字符是单词字符,则在字符串的最后一个字符之后。
  字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。

10-04 11:35