JS-关于正则表达式验证的问题 30
要求用正则表达式去验证text框中由用户输入的四则运算表达式是否正确,而且还要讲究优先级,比如(((1+2)*3)/4)-5,但是关键的问题是如何在正则表达式中去匹配一对...
要求用正则表达式去验证text框中由用户输入的四则运算表达式是否正确,而且还要讲究优先级,比如 (((1+2)*3)/4)-5,但是关键的问题是如何在正则表达式中去匹配一对括号(),以及那两个括号到底是一对,如果有多对括号又怎么匹配,应该怎么写这个正则表达式,请各位大虾指点!
最后能给出具体的解决实例。谢了。 补充说明:在这里我不需要表达式的结果,只需要验证这个表达式是否正确,所以eval根本行不通,因为在实际工作中,我需要做一个动态报表,需要由用户去输入表达式的列的一个四则运算表达式,就像在EXCEL中的表达式一样(我已经有办法将数据库中表的某列绑定为1,2,3等数字),然后再在JAVA中将指定的列的数据按照表达式算出来,形成动态报表的列。那我应该怎么做(其实主要问题还是怎么去判断用户输入的表达式是否正确,一旦不正确而在页面中又验证不出来,那么在后台我和表的列转换时就会报SQL语法错误)? 展开
最后能给出具体的解决实例。谢了。 补充说明:在这里我不需要表达式的结果,只需要验证这个表达式是否正确,所以eval根本行不通,因为在实际工作中,我需要做一个动态报表,需要由用户去输入表达式的列的一个四则运算表达式,就像在EXCEL中的表达式一样(我已经有办法将数据库中表的某列绑定为1,2,3等数字),然后再在JAVA中将指定的列的数据按照表达式算出来,形成动态报表的列。那我应该怎么做(其实主要问题还是怎么去判断用户输入的表达式是否正确,一旦不正确而在页面中又验证不出来,那么在后台我和表的列转换时就会报SQL语法错误)? 展开
6个回答
展开全部
给你个思路。呵呵,
你要验证这个四则是否正确,先列出来条件。
首先括号得一一对应,也就是说数目得相同,对不
其次反括号后面必须有[+-*/]对不。
那就先匹配“(”看有多少个,再匹配")[+-*/]" 如果二者数目相等,就可以实现。四则运算就简单多了,大概写一下。
四则运算肯定先算最内的括号,那么就先匹配最先的括号
String regex="\\(([^\\(]*?)\\)";
Pattern pa=Pattern.compile(regex)
Matcher ma=pa.......(content)
Integer result=null;
while(ma.find()){
将匹配出来的式子进行计算
将最里面的式子替换成计算结果,得到新的content
ma=......(content);
}
当无法匹配的时候,嘿嘿,也就代表计算完毕的时候~~大概就这么个思路。。。
你要验证这个四则是否正确,先列出来条件。
首先括号得一一对应,也就是说数目得相同,对不
其次反括号后面必须有[+-*/]对不。
那就先匹配“(”看有多少个,再匹配")[+-*/]" 如果二者数目相等,就可以实现。四则运算就简单多了,大概写一下。
四则运算肯定先算最内的括号,那么就先匹配最先的括号
String regex="\\(([^\\(]*?)\\)";
Pattern pa=Pattern.compile(regex)
Matcher ma=pa.......(content)
Integer result=null;
while(ma.find()){
将匹配出来的式子进行计算
将最里面的式子替换成计算结果,得到新的content
ma=......(content);
}
当无法匹配的时候,嘿嘿,也就代表计算完毕的时候~~大概就这么个思路。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
eval 是正确的思路。
纯正则也可行,只不过太麻烦。
最好是正则配合eval。
<head>
<title>JavaScript测试</title>
<script type="text/javascript">
function checkFomula(str) {
if(/^[0-9\(\)\+\-\*\/]+$/.test(str)) {
try {
eval(str);
return true;
} catch(ex) {
return false;
}
}
return false;
}
</script>
</head>
<html>
<body>
<input type="text" id="text1" value="(((1+2)*3)/4)-5" />
<input type="button" id="button1" value="测试" onclick="alert(checkFomula(text1.value))"/>
</body>
</html>
纯正则也可行,只不过太麻烦。
最好是正则配合eval。
<head>
<title>JavaScript测试</title>
<script type="text/javascript">
function checkFomula(str) {
if(/^[0-9\(\)\+\-\*\/]+$/.test(str)) {
try {
eval(str);
return true;
} catch(ex) {
return false;
}
}
return false;
}
</script>
</head>
<html>
<body>
<input type="text" id="text1" value="(((1+2)*3)/4)-5" />
<input type="button" id="button1" value="测试" onclick="alert(checkFomula(text1.value))"/>
</body>
</html>
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的分给的太少了,呵呵~
我想你的问题就在于嵌套匹配!
正则表达式的嵌套匹配需要正则表达式引擎的支持,不是所有引擎都支持的!
如果不支持,你需要给出嵌套的层数,而且表达式会很长很复杂。
验证任意四则运算是否正确,还是不要使用正则,自己写程序处理吧。
用来匹配多层嵌套:\( ([^()] | (?R))* \)
我想你的问题就在于嵌套匹配!
正则表达式的嵌套匹配需要正则表达式引擎的支持,不是所有引擎都支持的!
如果不支持,你需要给出嵌套的层数,而且表达式会很长很复杂。
验证任意四则运算是否正确,还是不要使用正则,自己写程序处理吧。
用来匹配多层嵌套:\( ([^()] | (?R))* \)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用正则来匹配运算还是有点麻烦的,毕竟要处理括号的嵌套,你可以尝试eval text里面的字符串,然后放到try里面,catch的话则不正确
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这不是正则的解决范围了.一楼说的对,最简单的是eval
var fun = function(exp){
var r = false;
try{
r = eval(exp);
}catch(e){
}
return r;
}
func("((1+2)*3/4)-5")
var fun = function(exp){
var r = false;
try{
r = eval(exp);
}catch(e){
}
return r;
}
func("((1+2)*3/4)-5")
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询