【问题标题】:Change char in a string in JavaScript在 JavaScript 中更改字符串中的字符
【发布时间】:2013-09-03 13:32:11
【问题描述】:

我应该使用什么正则表达式和 JavaScript 中的 'replace()' 函数来更改 0 中每次出现的 char '_',但只要找到 char '.' 就停止工作?

例子:

_____323.____ ---> 00323._

____032.0____ --> 0032.0_

有没有比使用 'replace()' 更有效的方法?

我正在处理数字。特别是,它们都可以是浮点整数,所以我的字符串永远不会像 __32.12.32 或 __31.34.45 那样有两个点。最多只有一个点。

我可以在其中添加什么:

/_(?=[\d_.])/g

还要找到'_'后面什么都没有?

示例:0__ 或 2323.43_

这不起作用:

/_(?=[\d_.$])/g

【问题讨论】:

  • 你可以使用replace()和reg-ex,你的选择是什么?
  • @dystroy 抱歉,在看到你和你的答案之前,我放弃了我的评论。
  • 总有一个时期吗?
  • @JasonMcCreary 我理解 “它们都可以是浮点整数 [...] 最多只有一个点” 作为 NO。
  • 既然_032.0_是可能的,为什么_032._0不可能呢?

标签: javascript regex string


【解决方案1】:

你可以使用

str = str.replace(/[^.]*/,function(a){ return a.replace(/_/g,'0') })

Reference

【讨论】:

  • 你能解释一下当第二个参数是函数时替换是如何工作的吗?
  • @Jongware 我知道它实际上是如何工作的,我想让它成为一个更好的答案,因为它是一个聪明的答案。
  • @UmurKontacı 我添加了参考。
  • 非常好的使用全局标志(当不存在时)+1
【解决方案2】:

没有替换/正则表达式:

var foo = function (str) {
  var result = "", char, i, l;
  for (i = 0, l = str.length; i < l; i++) {
    char = str[i];
    if (char == '.') {
      break;
    } else if (char == '_') {
      result += '0';
    } else {
      result += str[i];
    }
    char = str[i];
  }
  return result + str.slice(i);
}

使用正则表达式:dystroy

本文中各种答案的基准: http://jsperf.com/regex-vs-no-regex-replace

【讨论】:

  • 非正则表达式不需要那么大的答案:var str = "__323.__345._"; var newstr = str.substr(0,str.indexOf('.')).replace(/_/g,'0')+str.substr(str.indexOf('.'));
  • @SmokeyPHP 您的评论中有一个正则表达式。
  • @Aegis 太棒了,感谢您的参与,但我的意思是反对 dystroy 提供的正则表达式解决方案。
  • @SmokeyPHP 我知道,我会将其添加到测试中。我的观点是,如果您想要性能,那么避免使用正则表达式是一个好主意,即使只有一个:p
【解决方案3】:

除非你有其他一些不为人知的情况 -

找到:

 _(?=[\d_.])

替换:

 0

或“也查找 _ 后无任何内容,例如:0__ 或 2323.43_”

_(?=[\d_.]|$)

【讨论】:

    【解决方案4】:

    您可以在正则表达式中使用前瞻断言...

    "__3_23._45_4".replace(/_(?![^.]*$)/g,'0')
    

    结果:003023._45_4

    解释:

    /          # start regex
    _          # match `_`
    (?!        # negative lookahead assertion
    [^.]*$     # zero or more (`*`) not dots (`[^.]`) followed by the end of the string
    )          # end negative lookahead assertion
    /g         # end regex with global flag set
    

    【讨论】:

    • 注意:__323.__345._ 失败(如果出现这种情况)
    • 对我来说,它只在最后一个 . 字符之前停止,忽略所有以前的字符(替换 undescores)。
    • 即使在 Python 中也不起作用:re.sub(r'_(?![^.]*$)', "0", "__3_23._45_4._5") 结果:'003023.04504._5'
    【解决方案5】:
    var str = "___345_345.4w3__w45.234__34_";
    
    var dot = false;
    str.replace(/[._]/g, function(a){
      if(a=='.' || dot){
        dot = true;
        return a
      } else {
        return 0
      }
    })
    

    【讨论】:

    • 关于您的 str :“最多只有一个点”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多