首页 文章

JavaScript正则表达式匹配数学表达式

提问于
浏览
0

我需要这个正则表达式的帮助:

let j = numberArray.join("").match(/^([\d]*\.{1,}[\d]+|[\d]+)|([-+*/](?=\.|[\d]))|\.[\d]+|[\d]+/g);

这是我需要匹配的标准:

  • 一个数字不能有多个小数 . 例如,仅允许 .1231.123 等数字,但不允许 ...331.2.3.3 .

  • 一个或多个附加运算符不能跟随运算符 . 因此,用户不能连续输入 + 后跟 * .

一个示例输入和输出:

输入: ..123+*/.4.3.5-+..3+123

会产生输出: .123/.435+.3+123

我实际上认为我有第二个标准(关于运算符)所有设置,但我一直在努力与小数点 . 我是正规表达的新手,我正在努力破解这个,但现在它已经开始让我找到了一段时间 . 任何帮助深表感谢!

1 回答

  • 2

    如果你单独执行这些操作,逻辑可能会更容易 - 首先找到具有多个小数的数字,并修复它们使它们只包含第一个小数位,然后找到重复的运算符,并用最终的运算符替换它们:

    const clean = str => str
      // Match zero or more digits, followed by a decimal,
      // followed by more digit and decimal characters
      // For everything past the first decimal, replace decimals with the empty string
      .replace(
        /(\d*\.)([\d.]+)/g,
        (_, g1, g2) => g1 + g2.replace(/\./g, '')
      )
      // Match 2 or more operators, capture the last operator in a group
      // Replace with the last operator captured
      .replace(
        /([-+/*]){2,}/g,
        '$1'
      );
      
    console.log(clean('..123+*/.4.3.5-+..3+123'));
    

相关问题