【问题标题】:Replacement issues更换问题
【发布时间】:2015-10-16 06:27:57
【问题描述】:

在过去的一周里,我一直遇到替换和 javascript 方面的问题。我正在用 Python 做各种各样的替换,到目前为止我从来没有遇到过这么多问题。请帮我? :P

这是我的代码中给我带来问题的部分:

function SaeReplacerMenuButton(buttonchosen){
var Texto = document.getElementById("wpTextbox1").value;
$("."+buttonchosen).each(function() {
    var Reemplazo = this.value.split("=");
    var PalabraAntigua = new RegExp(Reemplazo[0],'g'); /*Esto genera el regext*/
    Texto = Texto.replace(" "+PalabraAntigua+" ", " "+Reemplazo[1]+" ");
    Texto = Texto.replace(" "+PalabraAntigua+".", " "+Reemplazo[1]+".");
    Texto = Texto.replace(" "+PalabraAntigua+",", " "+Reemplazo[1]+",");
    }
);
document.getElementById("wpTextbox1").value = Texto;
}

应该:

  1. 从特定字段(实际上是具有特定类的文本区域)获取字符串。这些文本区域之一中的值例如:“miedo={{miedo}}”。
  2. 然后一分为二。
  3. 然后搜索空格“miedo”之间的第一个分割。
  4. 我找到任何匹配项,将其替换为第二次拆分 ( {{miedo}} )。

在那之后,我添加了一些代码来进行替换,如果也用 a 和 a 找到它。而不仅仅是空格,这就是问题开始的时候。当我运行脚本时,它会替换:

miedo miedo miedo miedo miedo miedo miedo miedo miedo miedo

与:

 miedo {{miedo}} {{miedo}}.{{miedo}} {{miedo}}.{{miedo}} {{miedo}}.{{miedo}} {{miedo}}.{{miedo}} miedo

但是为什么?原始文本中没有任何点,所以应该替换它添加点的代码不应该做任何事情。

注意:我对 RegEx 一无所知,所以这是尝试使用 var + 空格而不是字符串进行全局替换。有没有“简单”的方法可以做到这一点?

我尝试在 jsfiddle 上复制它,如 http://prntscr.com/7wwns1 所示,但我无法让它工作,所以我决定上传脚本,以便你们测试它。
这是一个 .rar 文件,里面有一个 .js 和一个 .html:http://coznothingisforever.webs.com/replacerforstackoverflow.rar

【问题讨论】:

  • 我尝试不使用 regext,但它只替换了一次所需的单词,可以在这里看到的问题:stackoverflow.com/questions/10136097/… 所以我尝试使用 RegExt,然后我确实迷路了:D

标签: javascript regex replace


【解决方案1】:

我认为你想要的功能是这样的:

function SaeReplacerMenuButton(buttonchosen){
    var Texto = document.getElementById("wpTextbox1").value;
    $("."+buttonchosen).each(function() {
        var Reemplazo = this.value.split("=");
        Texto = Texto.replace(new RegExp("(\\b)"+Reemplazo[0]+"(\\b)", "g"), "$1"+Reemplazo[1]+"$2");
    });
    document.getElementById("wpTextbox1").value = Texto;
}

如果你真的只想匹配空格、逗号和句号,RegExp 可以是:

new RegExp("(\\b)"+Reemplazo[0]+"([ ,\\.])", "g")

【讨论】:

  • 是的,但我不明白为什么。我确实接受了另一个答案,因为它也解释了原因。不过,谢谢。
【解决方案2】:

当您创建一个RegExp object,然后向其中添加一个 sring 时,您会得到一个字符串,而不是一个正则表达式。

看看控制台写了什么:

var rx = new RegExp("word","g");
console.log(typeof(rx)); // -> object
var rx2 = " " + rx + " ";
console.log(typeof(rx2)); // -> string

因此,您不能添加空格或任何其他类似的字符串。您需要在 RegExp 创建时添加它们。

现在,您正在寻找的是word boundaries

有资格作为单词边界的三个不同位置:

在字符串的第一个字符之前,如果第一个字符是单词字符。

在字符串最后一个字符之后,如果最后一个字符是单词字符。

字符串中两个字符之间,一个是单词字符,另一个不是单词字符。

不应将单词边界放置在捕获组中,因为它们是零宽度的断言,就像环顾四周,不消耗任何文本并且始终为空(因此,不需要使用捕获组或反向引用的额外开销):

function replace() {
  var Texto = document.getElementById("wpTextbox1").value;
  var Reemplazo = "miédo={{miédo}}".split("=");
  var PalabraAntigua = new RegExp("\\b"+Reemplazo[0]+"\\b(?!}})",'g');
  Texto = Texto.replace(PalabraAntigua, Reemplazo[1]);
//var PalabraAntigua = new RegExp(Reemplazo[0],'g'); /*Esto genera el regext*/
//Texto = Texto.replace(" "+PalabraAntigua+" ", " "+Reemplazo[1]+" ");
//Texto = Texto.replace(" "+PalabraAntigua+".", " "+Reemplazo[1]+".");
//Texto = Texto.replace(" "+PalabraAntigua+",", " "+Reemplazo[1]+",");
  document.getElementById("t").innerHTML = Texto;
}
<input id="wpTextbox1" value="miédo miédo miédo miédo miédo miédo miédo miédo miédo miédo"/>
<input type="Submit" onclick="replace();"/>
<div id="t"/>

【讨论】:

  • 如何防止双重替换?我的意思是,如果我点击按钮,它会正确替换它并将“miedo”更改为“{{miedo}}”,但如果我再次点击,它会将{{miedo}}替换为{{{{miedo}}}}。
  • 实际上它并没有按我的需要工作,因为我忘记了我需要西班牙语,所以还需要像éáíóúñÑ这样的字符。
  • 我认为代码支持每种语言,因为正则表达式模式的输入来自外部源,用户可以输入适当的数据来创建和替换模式。我已经添加了(?!}}) 前瞻,这样已经替换的子字符串就不会再次被触及。
猜你喜欢
  • 1970-01-01
  • 2016-11-01
  • 2013-10-04
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多