我的javascript regexp有问题。 这是我的正则表达式:
(([\+\-\/\*\^]?)([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*)?(([(]*([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?)[)]*))?([\+\-\/\*\^])([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*))+
此regexp测试是否文本是一个例如的公式(18*19)/2
,我可以像变量一样添加QXX
,例如:
Q18/42+7*Q7
这个正则表达式在java中完美运行(我在http://fiddle.re/dnbh6上测试过它)。但是,当我尝试在javascript中转换它时,它不起作用...... 这是我尝试的所有解决方案:
var reg =/(([\+\-\/\*\^]?)([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*)?(([(]*([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?)[)]*))?([\+\-\/\*\^])([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*))+/g;
reg.test("Q18+aaaa)//return true, but in java this is resturn false
var reg= new RegExp("(([\+\-\/\*\^]?)([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*)?(([(]*([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?)[)]*))?([\+\-\/\*\^])([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*))+", "g");
reg.test("Q18+aaaa)//return true, but in java this is resturn false
所以,如果你有任何想法,我会尝试。
答案 0 :(得分:0)
我不确定你在这里做的是否正确,但我想我知道你的问题是什么。
在Java中如果使用matches()
方法,它会将正则表达式与完整字符串匹配。
Javascript没有这样做,它也返回部分匹配。要实现相同的行为,您必须在正则表达式周围添加锚点。 ^
匹配字符串的开头,$
匹配字符串的结尾。
所以看起来应该是这样的(缩短了巨型正则表达式!):
var reg= new RegExp("^(([\+\-\/\*\^]?)...([(]?value[)]?))[)]*))+$", "g");
Added anchors ==> ^ ^
答案 1 :(得分:0)
根据你对这个正则表达式的括号数量,我假设你不想捕获任何数据。只是验证输入的更好的正则表达式可能如下所示:
/
[(](?R)[)] # match parenthesis
|(?R)[-+/*^](?R) # allow to use one operator over to operands
# a number, can be separated by "," or "." and can be followed by a exponent,
# do _not_ accept decimal mark
|[+-]?\d+([,.]\d+)?(e[+-]\d+)?
|Q[0-9]+(e[+-]\d+)?
|value
/x
由于递归你不能使用锚点,我也使用PCRE的(?R)
你需要某种类型的库支持来进行递归,如评论中所述。
编辑:如果要保存数据,可以编写解析函数,具有以下大纲:
function parse(input) {
var output = [],
brackets = 0,
op = null,
qvariable = false,
buff = [],
stringbuff = '',
sign = null;
for (i = 0; i < input.length; i++) {
var currentChar = input.charAt(i);
if (sign && /[0-9]/.test(currentChar)) {
return 'erro, expecting number';
}
if (op != null && /[-+/*(]/.test(currentChar)) {
op = null;
}
switch (currentChar) {
case '(':
buff.push(output);
output = [];
break;
case ')':
if (op != null) { return 'operator before parenthesis close'; }
output.push(stringbuff);
parenthesis = output
output = buff.pop();
output.push(parenthesis);
stringbuff = '';
break;
case '-':
case '+':
case '/':
case '*':
if (op == null) {
op = currentChar;
} else {
if (currentChar == '-' && currentChar == '+') {
sign = currentChar;
} else {
return 'error, two operators in sequence';
}
}
output.push(stringbuff);
output.push(op);
stringbuff = '';
break;
case 'Q':
if (!stringbuff.length) { return null; }
qvariable = true;
stringbuff += currentChar;
// todo: handle comma, dot and exponents
default:
if (/[0-9]/.test(currentChar)) {
if (sign) {
stringbuff += sign;
sign = null;
}
stringbuff += currentChar;
} else {
return 'unexpected input';
}
break;
}
}
if (stringbuff.length) {
output.push(stringbuff);
}
return output;
}