【问题标题】:Empty value if regex match not found JavaScript如果未找到正则表达式匹配 JavaScript,则为空值
【发布时间】:2020-04-01 18:39:27
【问题描述】:

我正在尝试提取开头的任何文本字符,以及字符串的以下两个数字。如果字符串以数字开头,我希望得到一个空字符串值,因此结果数组仍然包含 3 个值。


字符串: 'M2.55X.45'

代码: 'M2.55X.45'.match(/(^[a-zA-Z]+)|((\.)?\d+[\/\d. ]*|\d)/g)

预期: ["M", "2.55", ".45"]

实际(正确): ["M", "2.55", ".45"]


字符串: '2.55X.45'

代码: '2.55X.45'.match(/(^[a-zA-Z]+)|((\.)?\d+[\/\d. ]*|\d)/g)

预期: ["", "2.55", ".45"]

实际: ["2.55", ".45"]

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    请改用/^([a-zA-Z]?)(\d*(?:\.\d+)?)[a-zA-Z](\d*(?:\.\d+)?)$/.exec("2.55X.45")。这将返回一个数组,其中第一个元素是整个匹配项,因此您必须访问组 1-indexed,例如 match[1] 的第一个值。你可以试试这个here

    【讨论】:

      【解决方案2】:

      您当前的正则表达式使用备用子句 (|),它根据匹配的备用子句创建不同类型的分组。

      这是一个创建显式组并使各个组可选的示例(稍微整理一下)。

      const regex = /^([a-zA-Z]*)?(\d*(?:\.\d+)?)([a-zA-Z]+)(\d*(?:\.\d+)?)$/
      
      console.log(regex.exec("2.55X.45"))
      console.log(regex.exec("M2.55X.45"))

      请注意,我已删除 g 标志,因此正则表达式的 state isn't preserved

      我还使用exec 代替matchnot discard capture groups

      【讨论】:

        【解决方案3】:

        你可以试试这个模式

        (\D*)(\d+(?:\.\d+))\D+(\.\d+)
        

        let finder = (str) => {
          return (str.match(/^(\D*)(\d+(?:\.\d+))\D+(\.\d+)/) || []).slice(1)
        }
        
        console.log(finder('M2.55X.45'))
        console.log(finder("2.55X.45"))

        【讨论】:

          猜你喜欢
          • 2018-03-24
          • 1970-01-01
          • 2022-12-11
          • 2011-11-29
          • 2012-09-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多