代码之家  ›  专栏  ›  技术社区  ›  learner

用于验证和从计算中提取数据的正则表达式

  •  0
  • learner  · 技术社区  · 7 年前

    我试图找到一个正则表达式,在这里我可以验证输入,并从输入中提取所需的信息。

    我的输入包含一个简单的计算,如加法、减法、乘法和除法。

    例如:如果输入是addtion say 7.01+9.05

    var input = '7.01+9.05';
    
    var pattern = /^-?\d+\.?\d+[-+*\/]-?\d+\.?\d+$/
    var sign;
    if (input.match(pattern)) {
        var matches = pattern.exec(input);
    
        var left = // logic to extract value 7.01 using matches variable;
        var right = // logic to extract value 9.05 using matches variable;
        var sing = // logic to extract symbol + using matches variable;
    }
    

    我使用了从这篇文章中找到的正则表达式: Calculator Regular Expression with decimal point and minus sign

    你能帮我在上面的代码中如何提取所需的数据吗?

    3 回复  |  直到 7 年前
        1
  •  1
  •   The fourth bird    7 年前

    按照你的模式 ^-?\d+\.?\d+[-+*\/]-?\d+\.?\d+$ 要匹配可选点,请使用 \d+\.?\d+ 但现在要匹配的最小位数是2,因为使用 \d+ 所以1+1不匹配。

    如果只是简单的计算,可以使用3个捕获组,并使用 ?\d+(?:\.\d+)?

    你的模式可能是:

    ^(-?\d+(?:\.\d+)?)([-+*\/])(-?\d+(?:\.\d+)?)$
    

    解释

    • ^ 字符串开头
    • (-?\d+(?:\.\d+)?) 捕获组1,将1+个数字与可选的小数部分匹配
    • ([-+*\/]) 捕获组2,匹配character类中列出的任何
    • (?)D+(?):\\ +)? 捕获组2,将1+个数字与可选的小数部分匹配
    • $ 字符串结尾

    regex101 demo

    例如

    var regex = /^(-?\d+(?:\.\d+)?)([-+*\/])(-?\d+(?:\.\d+)?)$/;
    [
      "21+22",
      "7.01+9.05",
      "1-1",
      "1*1",
      "0*1000000",
      "8/4"
    ].forEach(x => {
      var res = x.match(regex);
      var left = res[1];
      var right = res[2];
      var sing = res[3];
      console.log(left, right, sing);
    });
        2
  •  1
  •   Douglas Eleuterio    7 年前

    当然!

    您应该在regex表达式中使用 () | . 为正则表达式定义一个标志全局以捕获所有组是很重要的。

    你需要抓住三件事:

    • 左边的数字-> ^-?\d+\.?\d+
    • 标志-> [-+*\/]
    • 正确的数字-> -?\d+\.?\d+$

    你应该用 γ 对regex的交替使用捕捉组,如组中的or语句。

    最终的regex将是:

    var pattern = /(^-?\d+\.?\d+)|([-+*\/])|(-?\d+\.?\d+$)/g
    

    输出结果将是一个数组,其中第一个位置是左边的数字,第二个位置是符号,第三个位置是右边的数字。

    因此,代码的其余部分将如下所示:

    if (input.match(pattern)) {
        var matches = input.match(pattern); \\ I recommend use input.match here too
    
        var left = matches[0];
        var right = matches[2];
        var sing = matches[1];
    }
    
    
        3
  •  1
  •   Maheer Ali    7 年前

    你可以用 split()

    var input = '7.01+9.05';
    
    var pattern = /^-?\d+\.?\d+[-+*\/]-?\d+\.?\d+$/
    if (input.match(pattern)) {
        var matches = pattern.exec(input)[0].split(/(\+|-|\*|\/)/);
    
        var left = matches[0];
        var right = matches[2];
        var sign = matches[1];
        console.log(left,sign,right);
    }