验证公式正确性 使用java下的正则表达?

作者&投稿:蛮详 (若有异议请与网页底部的电邮联系)
验证公式正确性 java下的正则表达?~

//分给我吧。。剩下的能自己搞定不
//搞到需求5了。。。剩下的有空继续搞
//你的想法还很不成熟,光想到用A替换。。。这个估计是人都
//都能想到,真正的关键是对所有的函数,程序块进行结构建模
//等都建模结束了,就可以简单的用正则来替换实现
public class DateTest {
public static void main(String args[]) throws Exception{
String str1 = "(Z0$1001+K1$1001)+C2$1001-max(Z1$1001-Z1$1001,0)";
System.out.println(validateExpression(str1));
}

public static boolean validateExpression(String expression) {
//去掉算式中所有的合法项替换为"?"字符
expression = expression.replaceAll("((K|Z|C)\\d\\$(\\d)+(\\.(\\d)*){0,1})","?");
//去掉替换后算式中所有的空格
expression = expression.replaceAll(" ","");
//如果有两个相邻的项中间没有操作符,则算式不合法
if(expression.matches("^??$")) {
return false;
}
/**
* 增加你需要的函数运算符,如果函数内部参数结构不同则需要改写正则表达式
*/
//如果包含合法max运算符,则替换max运算符为"?"字符
System.out.println("max: " + expression);
if(expression.matches("^(.)*max\\(\\?-\\?,\\d\\)(.)*$")) {
expression = expression.replaceAll("max\\(\\?-\\?,\\d\\)", "?");
}
System.out.println("max: " + expression);
/**
* 增加你需要的程序块运行符,如果程序块内部参数结构不同则需要改写正则表达式
*/
//FIXME if-else语句块未实现,等待实现
//如果包含合法if-else语句块,则替换if-else语句块为"?"字符
// if(expression.matches("^(.)*if\\{(.)*\\}(.)*$")) {
// expression = expression.replaceAll("max\\(\\?-\\?,\\d\\)", "?");
// }
//必须是倒数第二步:判断小括号左右括弧是否等同,括弧位置是否合法,如果括弧全部合法,则去掉所有括弧
int num = 0;
char[] expChars = expression.toCharArray();
for(int i = 0; i < expChars.length; i ++) {
char temp = expChars[i];
if(temp == '(') {
num++;
} else if(temp == ')') {
num--;
}
if(num < 0) {
return false;
}
}
if(num > 0) {
return false;
}
expression = expression.replaceAll("\\(|\\)", "");
System.out.println(expression);
//必须是最后一步:判断仅剩的+-*/四则运算算式是否合法
System.out.println(expression);
if(expression.matches("^\\?((\\+|-|\\*|\\/)\\?)*$")) {
return true;
} else {
return false;
}

}
}

目前仍没有人解决1、3、5、7、8、10、12月是31天的大月问题呀
(我本是1楼)如果用正则去验证“数值”,会很舍近求远,不是正则的强项。需要写很多的“向后断言”。效率会一般甚至很低。(目前我看到的上下楼的都是有漏洞的,没法检验闰月和大小月)
我所不取。

我一直用的这个:
static public boolean isValidDate(
int year, int mon, int day,
short year_min,short year_max,
StringBuffer msg)
{
if(yearyear_max)
{
msg.append("年份必须在("+
year_min+"~"+year_max+
")之间,输入值("+year+")无效
");
return false;
}else{//
switch(mon){
case 1:case 3:case 5:case 7:case 8:case 10:case 12:{
if(day31){
msg.append("日号必须在(1~31)之间,输入值("+day+")无效
");
return false;
}
}break;
case 2:{
if(isLeapYear(year) && day>29){
msg.append("闰年的闰二月日号必须在(1~29)之间,"+year+"是闰年,输入值("+day+")无效
");
return false;}else if(day>28){
msg.append("非闰年的闰二月的日号必须在(1~28)之间,"+year+"不是闰年,输入值("+day+")无效
");
return false;
}
}break;
case 4:case 6:case 9:case 11:{
if(day30){
msg.append("日号必须在(1~30)之间,输入值("+day+")无效
");
return false;
}

}break;
default:{
msg.append("月份必须在(1~12)之间,输入值("+mon+")无效
");
return false;

}
}
}
return true;
}
static public boolean isLeapYear(int year){
return (year%4==0 && year%100!=0)|| year%400==0;
}
包好。

//搞到需求5了。。。剩下的有空继续搞
public class DateTest {
public static void main(String args[]) throws Exception{
String str1 = "(Z0$1001+K1$1001)+C2$1001-max(Z1$1001-Z1$1001,0)";
System.out.println(validateExpression(str1));
}

public static boolean validateExpression(String expression) {
//去掉算式中所有的合法项替换为"?"字符
expression = expression.replaceAll("((K|Z|C)\\d\\$(\\d)+(\\.(\\d)*){0,1})","?");
//去掉替换后算式中所有的空格
expression = expression.replaceAll(" ","");
//如果有两个相邻的项中间没有操作符,则算式不合法
if(expression.matches("^??$")) {
return false;
}
/**
* 增加你需要的函数运算符,如果函数内部参数结构不同则需要改写正则表达式
*/
//如果包含合法max运算符,则替换max运算符为"?"字符
System.out.println("max: " + expression);
if(expression.matches("^(.)*max\\(\\?-\\?,\\d\\)(.)*$")) {
expression = expression.replaceAll("max\\(\\?-\\?,\\d\\)", "?");
}
System.out.println("max: " + expression);
/**
* 增加你需要的程序块运行符,如果程序块内部参数结构不同则需要改写正则表达式
*/
//FIXME if-else语句块未实现,等待实现
//如果包含合法if-else语句块,则替换if-else语句块为"?"字符
// if(expression.matches("^(.)*if\\{(.)*\\}(.)*$")) {
// expression = expression.replaceAll("max\\(\\?-\\?,\\d\\)", "?");
// }
//必须是倒数第二步:判断小括号左右括弧是否等同,括弧位置是否合法,如果括弧全部合法,则去掉所有括弧
int num = 0;
char[] expChars = expression.toCharArray();
for(int i = 0; i < expChars.length; i ++) {
char temp = expChars[i];
if(temp == '(') {
num++;
} else if(temp == ')') {
num--;
}
if(num < 0) {
return false;
}
}
if(num > 0) {
return false;
}
expression = expression.replaceAll("\\(|\\)", "");
System.out.println(expression);
//必须是最后一步:判断仅剩的+-*/四则运算算式是否合法
System.out.println(expression);
if(expression.matches("^\\?((\\+|-|\\*|\\/)\\?)*$")) {
return true;
} else {
return false;
}

}
}

运算符 * / 可以吗 < > <> 可以吗
描述要清楚。
包括:max,min,abs,round,if,then等(写全)

这道题目 很难搞的! 它需要花时间的!分数不多啊!
简单的说明一下解法:
自上而下的文法分析!分离出关键字,分隔付,变量,和产生式。
其中判断产生式的合法性
比如Max(E,E) 这个就是合法,但其中 E必须不可在规约,//E为一个表达四
比如 Max(Max(E,E),E), 所以递归归约产生式,
if(E) then //这是表达式 其它都不合法
也是同样的道理!对E进行递归归约!
这样语法分析好后,在进行你的词法分析 (其中分离出的变量就是你要分析的) 就可以用正则!

谁知到啊


红河哈尼族彝族自治州13572557704: 用JAVA判断输入的公式 -
宠雁盐酸: import java.awt.Frame; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; ...

红河哈尼族彝族自治州13572557704: 使用java下,已知int i=10,j=0;计算下面表达式的值,并通过程序验证计算结果是否正确? -
宠雁盐酸: (1)i=10 j=16(2)i=11 j=16(3)i=10 j=5(4)i=10 j=13

红河哈尼族彝族自治州13572557704: 编写一个验证邮箱地址格式正确性的正则表达式,并解释正则表达式的含义.答案要快,情况紧急!!! -
宠雁盐酸: JS中这样写 var CheckMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/; var email = document.getElementById( "email" ); if(!CheckMail.test(email)) { alert("email格式不对!"); return false; } 真正含意不想多说正则这东西.说了也只会一知半解!

红河哈尼族彝族自治州13572557704: 如何使用正则表达式判断用户输入的公式是否合法. 允许四则混合运算和多重括号. -
宠雁盐酸: ^(?!.*[^\d+\-*/\(\)]) #规则0,字符串必须由数字,符号和括号组成(?!.*\)\d) #规则A,不允许右括号后接数字(?!.*[+\-*/]([+\-*/]|\))) #规则B,不允许符号后面接符号或右括号(?!.*\([+*/]) #规则C,不允许左括号后接运算符(- ...

红河哈尼族彝族自治州13572557704: java 正则验证 问题 -
宠雁盐酸: 先写一个正则匹配中文.然后使用replaceAll("zhongwenzhengze".""),将中文替换成空,再使用你上面的正则进行匹配.中文的正则原谅我不会写,可以百度下.很简单

红河哈尼族彝族自治州13572557704: 编程实现矩形类,其中包括计算矩形周长和面积的方法,并测试方法的正确性,用JAVA编写 -
宠雁盐酸: /** * 矩形类 */ public class Rectangle { private double length; //长 private double width; //宽 public double getLength() { return length; } public void setLength(double length) { this.length = length; } public double getWidth() { return width; } public void ...

红河哈尼族彝族自治州13572557704: 如和用java 写一个 正则表达式 验证日期的 要精确到毫秒的 2009 - 03 - 23 - 13.53.29.000000 -
宠雁盐酸: import java.text.ParseException; import java.text.SimpleDateFormat; public class Test { public static boolean isDate(String strDate, String sign) { boolean back = true; SimpleDateFormat sdf = new SimpleDateFormat(sign); try { sdf.parse(strDate); } ...

红河哈尼族彝族自治州13572557704: java 验证字符串是否为sql语句 并且是否包含 select 关键字 -
宠雁盐酸: java验证字符串是否为sql语句,是否包含select关键字,主要使用的是正则表达式来进行验证,如下:import java.util.*; import java.text.*; class sqltest { public static void main(String[] args) { String span="select aaaa.id name ,hello ,type t,h from ...

红河哈尼族彝族自治州13572557704: 用java设计,键盘输入一个四则运算等式,判断运算是否正确 -
宠雁盐酸: Scanner sc = new Scanner(System.in); String str =sc.nextLine(); String[] arr = str.split("=");//根据等号分隔等式两边的字符串 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager....

红河哈尼族彝族自治州13572557704: java验证欧拉公式 所有题 -
宠雁盐酸: //#include "stdafx.h"#include <stdio.h>bool isPrime(int n){ if(n==2) return true; if(n<2) return false; if(n%2==0) return false; for(int i=3;i<=n/i;i+=2) if(n%i==0) return false; return true; } int OuLa(int n)//an=n??-n+41 { return (n*n-n+41); } int main() { int ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网