【问题标题】:Splitting a string into an array of floats and characters将字符串拆分为浮点数和字符数组
【发布时间】:2017-09-27 19:26:23
【问题描述】:

我们正在处理一个可以包含整数、浮点数和字符的字符串。

例子:

.12A1.3B.5CD

我想把那个字符串变成一个看起来像

的数字和字符数组

[.12,A,1.3,B,.5,C,0,D]

(当字母前面没有数字时,假定为0)

我尝试了不同的正则表达式组合,但无法像这样工作:

str.match(/[a-zA-Z]+?[0-9]*\.?[0-9]+/g)

但它给了我以下结果:

[“12”、“A”、“1”、“3”、“B”、“5”、“CD”]

去掉小数点,不将“D”分隔为“0,D”

同样,期望的结果是 [.12,A,1.3,B,.5,C,0,D]。

有什么猜测吗?

【问题讨论】:

  • 我建议您查看parseFloat()parseInt() 函数。
  • 我再次看到最慢的解决方案被接受并“过度点击”。悲伤但真实......

标签: javascript arrays regex


【解决方案1】:

您可以替换缺少的零并匹配零件。稍后在检查数字或字符串后映射该值。

var string ='.12A1.3B.5CD',
    array = string
        .replace(/((^|[a-z])(?=\.))|([a-z](?=[a-z]))/gi, '$&0')
        .match(/[.0-9]+|[a-z]/gi)
        .map(v => v == +v ? +v : v);

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    如果每个字母后面跟着另一个字母,则可以在每个字母后添加一个零,然后按字母拆分:

    var s = ".12A1.3B.5CD";
    
    console.log(
      s.replace(/([a-z])(?=[a-z])/gi, "$1"+"0").split(/([a-z])/i).filter(x => x != "")
    )

    【讨论】:

    • 您的方法唯一剩下的就是将数字字符串转换为数字。一般来说,您的方法似乎是最快的
    【解决方案3】:

    使用String.match()Array.reduce()isNaN() 函数:

    var s = '.12A1.3B.5CD', prev,
        result = s.match(/(\d*\.)?\d+|[a-zA-Z]/g).reduce(function(a, v){
            v = +v || v;
            if (a.length > 1 && +v !== v && isNaN(prev)) a.push(0);
            a.push(v);
            prev = v;
            return a;
        }, []);
    
    console.log(result)

    “速度”比较:

    【讨论】:

      【解决方案4】:

      这应该可以解决问题:

      str.match(\([a-zA-Z]|[0-9]*\.?[0-9]+)\g)

      然后使用 javascript 你应该在连续字母之间的数组中插入一个 0。

      查看正则表达式的好网站:https://regex101.com/r/vhnv2M/1

      【讨论】:

      • 它仍然没有在CD 之间插入0。并且语法错误(\而不是/)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 2012-02-22
      • 2011-01-10
      相关资源
      最近更新 更多