【问题标题】:About replace() code, how can i replace secondary "a" string?关于 replace() 代码,我如何替换辅助“a”字符串?
【发布时间】:2019-01-21 23:31:47
【问题描述】:
kName = "cglsamaz";
cName = kName.replace("a","e");
document.getElementById("anythingx").innerHTML = cName;

此代码结果:cglsemaz
我想要什么:cglsamez

【问题讨论】:

  • @zerkms 他不想替换所有的出现;只有第二个。这不是重复的。
  • @Gendarme 抱歉,我打字比阅读快 :-(
  • 是的,宪兵是对的。我只想改变第二个“a”。
  • this duplicate question,但确实没有满意的答案。

标签: javascript html


【解决方案1】:

我假设您想要一些通用解决方案,而不仅仅是字面上的 a,否则 Regex 模式可以做到。

为此可以使用lastIndexOfsubstring 的组合:

var kName = "cglsamaz";
var valueToReplace = 'a';
var newValue = 'e';
var replaceIndex = kName.lastIndexOf(valueToReplace);

var cName = 
    kName.substring(0, replaceIndex) +
    newValue +
    kName.substring(replaceIndex + valueToReplace.length);

document.getElementById("anythingx").innerHTML = cName;
<div id="anythingx"></div>

【讨论】:

    【解决方案2】:

    这是一个通用的解决方案,它使用一个函数作为.replace(...) 方法的第二个参数:

        function replacerMaker(rplc, inst) {
    
          // This is to keep track of the numbered instance found    
          var idx = 0;
    
          // this returns a function which will replace the numbered instance of
          // the search string with the replacement string
          return function(match, offset, string) {
          	if (++idx === inst) {
            	return rplc;
            }
            return match;
          }
        }
        
        // A slightly longer name to test instances 3, 4, etc.
        var kName = "cglsamazabkdsakuodakdif";
    
        var cName = kName.replace(/a/g, replacerMaker("e", 2));
        document.getElementById("anythingx").innerHTML = "Second Instance: " + cName;
        
        cName = kName.replace(/a/g, replacerMaker("e", 4));
        document.getElementById("anythingx").innerHTML += "<br />" + "Fourth Instance: " + cName;
    &lt;div id="anythingx"&gt;&lt;/div&gt;

    【讨论】:

    • 对于这样一个简单的任务,这似乎有些复杂。如果没有更简单的解决方案,简单地转换为 char 数组、操作然后返回字符串不是“更好”吗?
    • 很可能,你是对的,@Gendarme。这是探索.replace([RegEx], [function]) 语法的好借口。
    • 对不起。我刚刚意识到这不是Java。我打开的标签太多,我把这两个弄混了。
    【解决方案3】:

    我之前的回答有一个聪明的替代方案:

    kName = "cglsamaz";
    cName = kName.replace("a","*TEMP*");
    cName = cName.replace("a","e");
    cName = cName.replace("*TEMP*","a");
    document.getElementById("anythingx").innerHTML = cName;
    

    用临时值替换第一次出现,允许根据需要替换第二次出现(现在是第一次出现),然后将原始值恢复为临时值!可以简化为单个字符串。

    (我创建了一个新答案,因为它是一种完全不同的方法)

    【讨论】:

      【解决方案4】:

      您可以将其反转,然后将 a 替换为和 e,然后再将其反转。

      kName = "cglsamaz";
      kName = kName.split("").reverse().join("")
      cName = kName.replace("a","e");
      cName  = cName.split("").reverse().join("")
      

      但是,对于简单的更改,这似乎很冗长 希望有帮助

      【讨论】:

        【解决方案5】:
        kName = "cglsamaz";
        cName = kName.replace(/a(?=[^a]+$)/i,"e");
        document.getElementById("anythingx").innerHTML = cName;
        

        这将只替换任何字符串中的最后一个“a”。

        • 编辑(最终答案):
        kName = "cglsamaz";
        cName = kName.split("").reverse().join("").replace(/a(?=[^a]{0,}a{1,1}[^a]{0,}$)/i,"e").split("").reverse().join("");
        document.getElementById("anythingx").innerHTML = cName;
        

        很遗憾,JavaScript 不支持 Positive LookBehind。此代码将反转字符串,从末尾查找第二个“a”(即原始字符串开头的第二个“a”),替换它然后再次反转它。

        这完全符合要求,适用于任意数量的“a”字符,不区分大小写。为了使其也适用于其他字符,RegExp 可以动态修改。

        【讨论】:

        • 在这种情况下,最后一个“a”恰好与第二个“a”相同,但问题具体要求第二个。
        • 我刚刚编辑了我的答案。这是我能想到的最简单,或者至少是最紧凑的解决方案,因为 JavaScript RegExp 中缺少 Positive LookBehind 支持。
        猜你喜欢
        • 2019-01-08
        • 2020-04-09
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 2017-03-06
        相关资源
        最近更新 更多