【问题标题】:Regular expression for numbers and units数字和单位的正则表达式
【发布时间】:2014-12-21 19:56:12
【问题描述】:

我有一个带有数字和单位的动态字符串。

单位可以更改为 cm、%、...,但所有 4 个数字始终相同。像 "10px 12px 14px 16px" 而不是 "10px 12% 14cm 16in"

我需要一个正则表达式来给出如下结果:

string = "10px 12px 14px 16px" 
result = array = [ "10 12 14 16", "px" ]

考虑正则表达式应该匹配除上面唯一提到的任何单位。

我试过了,但没有运气:

var string = "10px 11px 13px 14px";
var match = string.match(/([0-9]+)(.*)/);
result: Array [ "10px 11px 13px 14px", "10", "px 11px 13px 14px" ]

【问题讨论】:

    标签: javascript arrays regex match


    【解决方案1】:

    你可以这样做:

    result = [string.match(/\d+/g).join(' '), string.match(/[a-zA-Z%]+/g).pop()]
    

    【讨论】:

      【解决方案2】:

      使用您的正则表达式 - 您可以使用 .split 将字符串拆分为数组,然后使用 pop 获取最后一个值:

      var str =  "10px 12px 14px 16px" ;
      var units =  str.split(/[0-9]+/g).pop(); // pop to get the last value
      var nums = str.split(" ").map(function(x){ return parseInt(x, 10); }).join(" ");
      var result = [nums, units];
      console.log(result);
      

      【讨论】:

      • 谢谢,它的结果是 array = [ "10px 12px 14px 16px", "px" ] not array = [ "10 12 14 16", "px" ]
      • @user3631047 没注意,已修复。
      • 仍然给出“px”。
      • 哦,现在它给了["10px 12px 14px 16px", "10 12 14 16"]
      • @Scimonster 大声笑,很抱歉 - 我用 str 而不是 nums 替换了单位 :)
      【解决方案3】:

      您可以先识别单位:

      var unit = string.match(/\d+(\S+)/).pop()
      

      然后,您可以将它们从字符串中删除,并将它们放在一起:

      result = [string.replace(new RegExp(unit,'g'),''), unit]
      

      【讨论】:

        【解决方案4】:

        您可以使用反向引用来检查所有单位是否相同:

        s = /^(-?[0-9]+)([^ ]*) *(-?[0-9]+)\2 *(-?[0-9]+)\2 *(-?[0-9]+)\2$/.exec(x);
        if (s) {
            result = [s[1], s[3], s[4], s[5], s[2]];
            ...
        } else {
           // No match (e.g. units are different)
        }
        

        【讨论】:

        • @user3631047:如果你通过了"10px 2cm 6em 3%",它不会检测到
        • 是的,但在我的代码中只能选择一个单位。再次感谢
        【解决方案5】:

        如果你允许自己做出这些非常安全的假设:

        1. 所有单位代号均由非数字(cm、px、pt、%)组成
        2. 所有值均由数字(10、12、14、16)组成

        这个正则表达式会得到你的值:

        string.match(/(\d+)/g);
        

        这将得到你的单位:

        string.match(/\D+$/);
        

        您可以将它们组合起来:

        string.match(/(\d+)|\D+$/g);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-14
          • 1970-01-01
          • 1970-01-01
          • 2012-11-23
          • 2012-06-02
          • 1970-01-01
          相关资源
          最近更新 更多