我正在尝试找出一个正则表达式,我可以在其中验证输入并从输入中提取所需的信息。
我的输入包含一个简单的计算,例如加,减,乘和除。
例如:如果输入是附加内容,请说 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
您能帮我如何从上述代码中提取所需的数据吗?
答案 0 :(得分:1)
您可以使用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);
}
答案 1 :(得分:1)
当然!
您应使用()
和|
在正则表达式中定义捕获组。为您的正则表达式定义全局标志以捕获所有组非常重要。
您需要捕获三件事:
^-?\d+\.?\d+
[-+*\/]
-?\d+\.?\d+$
您应该使用|
交替形式来使正则表达式使用捕获组,例如a或语句。
最终的正则表达式为:
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];
}
答案 2 :(得分:1)
在模式^-?\d+\.?\d+[-+*\/]-?\d+\.?\d+$
中,您想使用\d+\.?\d+
来匹配一个可选的点,但这种方法有效,但是由于使用{{1 }},因此1 + 1不匹配。
如果只是简单的计算,您可以做什么,您可以使用3个捕获组,并使用\d+
将数字与可选的小数部分匹配
您的模式可能如下:
?\d+(?:\.\d+)?
说明
^(-?\d+(?:\.\d+)?)([-+*\/])(-?\d+(?:\.\d+)?)$
字符串的开头^
捕获组1,将1个以上的数字与可选的小数部分相匹配(-?\d+(?:\.\d+)?)
捕获组2,与字符类中列出的任何一个匹配([-+*\/])
捕获组2,将1个以上的数字与可选的小数部分相匹配(-?\d+(?:\.\d+)?)
字符串结尾例如
$