java表达式解析
⑴ java的正则表达式解析
如果你是想获取字串中的数字 那你这段代码是有问题的 正则表达式也是有问题的 你应该这样用
public static void main(String[] args) {
String str = "abc$31.8zhe";
String reg = "[0-9\\.]+";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
m.find();
System.out.println(m.group());
}
[0-9\\.]+ 表示的意思是匹配0-9的数字和.本身 "."确实是需要转义的 而且因为在Java中"\"本身就是转义符 所以还需要再次转义 因此变成了"\\." +表示匹配一次或者多次
实际上0-9可以用\\d 代替 \d就表示匹配所有数字
当然这个表达式本身也不完善 比如它会匹配到类似与23. 这样的串 即使小数点后没有数字
楼主你会发现正则表达式和结果相反是因为你可能使用了replaceAll("") 它将所有匹配的片段替换为空 因此你的[^0-9\\.]其实是匹配了除了0-9和"."之外的所有字符 那些字符都被替换成了空 最后你的字串中的abc$zhe被干掉了 而只有没法匹配[^0-9\\.]的31.8被留了下来
⑵ JAVA 文本表达式解析成数学公式,计算出结果
正则表达分解字符串
然后运算
给你个例子。以前写的,现在忙没空给你写你这个了,public class CalStr { private String src;
/**
* constructor
*
* @param srcthe string(expression) to calculate
*/
public CalStr(String src) {
this.src = src;
}
/**
* calculate to get the result
*
* @return(double)result
*/
public double getResult() {
String postfix = getPostfix();
Stack stk = new Stack();
// System.out.println(postfix);
String parts[] = postfix.split( " + ");
double result = 0;
for (int i = 0; i < parts.length; i++) {
char tmp = parts[i].charAt(0);
if (!isOperator(tmp)) {
stk.push(parts[i]);
} else {
double a = Double.parseDouble((String) stk.pop());
double b = Double.parseDouble((String) stk.pop());
// b is followed by a in the orignal expression
result = calculate(b, a, tmp);
stk.push(String.valueOf(result));
}
}
return result;
}
/**
* test if the character is an operator,such +,-,*,/
*
* @param opthe character to test
* @returntrue if op is an operator otherwise false
*/
private boolean isOperator(char op) {
return (op == '+ ' || op == '- ' || op == '* ' || op == '/ ');
}
/**
* calculate an expression such (a op b)
*
* @param anumber 1
* @param bnumber 2
* @param opthe operator
* @return(double)(a op b)
*/
public double calculate(double a, double b, char op) {
switch (op) {
case '+ ':
return a + b;
case '- ':
return a - b;
case '* ':
return a * b;
case '/ ':
return a / b;
}
return -1;
}
/**
* convert the suffix to postfix
*
* @returnthe postfix as a string
*/
private String getPostfix() {
Stack stk = new Stack();
String postfix = new String();
char op;
int i = 0;
while (i < src.length()) {
if (Character.isDigit(src.charAt(i)) || src.charAt(i) == '. ') {
postfix += " ";
do {
postfix += src.charAt(i++);
} while ((i < src.length())
&& (Character.isDigit(src.charAt(i))));
postfix += " ";
}
else {
switch (op = src.charAt(i++)) {
case '( ':
stk.push( "( ");
break;
case ') ':
while (stk.peek() != "( ") {
String tmp = (String) stk.pop();
postfix += tmp;
if (tmp.length() == 1 && isOperator(tmp.charAt(0)))
postfix += " ";
}
stk.pop();
postfix += " ";
break;
case '+ ':
case '- ':
while ((!stk.empty()) && (stk.peek() != "( ")) {
postfix += stk.pop() + " ";
}
stk.push(String.valueOf(new Character(op)));
break;
case '* ':
case '/ ':
while ((!stk.empty())
&& ((stk.peek() == "* ") || (stk.peek() == "/ "))) {
postfix += stk.pop() + " ";
}
stk.push(String.valueOf(new Character(op)));
break;
}
}
}
ListIterator it = stk.listIterator(stk.size());
while (it.hasPrevious())
postfix += it.previous() + " ";
return postfix.trim().replaceAll( " +\\. ", ". ");
}
/**
* main function
*
* @param args
*/
public static void main(String args[]) {
System.out.println(new CalStr( "((1.5+6.000)*9+9.36)*(8+9-8*8+8*7) ")
.getResult());
}
}
⑶ 关于java正则表达式解析文本
交易数据的正则是
^\\s+\\d+\\s+\\d+$
说下思路,逐行处理
如果读到了买入,那直到读到卖出为止,所有匹配上面正则的行都按买入的方式处理
如果读到卖出,那直到读到买入为止,所有匹配上面正则的行都按卖出的方式处理
⑷ java表达式是什么
Java是面向表达式的语言,Java中一个简单表达式可以是下面任意一种:● 常量:7、false。● 单引号括起来的字符字面常量:'A'、'3'。● 双引号括起来的字符串字面常量:"foo"、"Java"。● 任何正确声明的变量名:myString、x。● 任何用Java二元运算符(本章稍后将详细讨论)连接起来的两个上述类型的表达式:x+2。● 任何用Java一元运算符(本章稍后将详细讨论)修饰的单个上述类型的表达式:i++。● 任何用小括号括起来的上述类型的表达式:(x+2)。以及另外一些与本书后面将要学到的对象有关的表达式类型。无论多么复杂的表达式都可以由不同类型的简单表达式和括号嵌套组合而成,例如:((((4/x) + y) * 7) + z)。2.9.1 算术运算符 Java语言提供了许多基本的算术运算符,如表2-1所示。表2-1 Java算术运算符运算符描 述+加法-减法*乘法/除法%求余(%左边的操作数除以右边的
操作数所得到的余数,例如10%3=1)+和-运算符也可作为一元运算符用于表示正负数:-3.7、+42。除了简单赋值运算符=,还有许多特定的复合赋值运算符,这些运算符将变量赋值和算术操作合并在一起,如表2-2所示。表2-2 Java复合赋值运算符运算符描 述+=a+=b等价于a=a+b-=a-=b等价于a=a-b*=a*=b等价于a=a*b/=a/=b等价于a=a/b%=a%=b等价于a=a%b最后要介绍的两个算术运算符是一元递增运算符(++)和一元递减运算符(--),用于将整数变量的值加1或减1,或者将浮点数变量的值加1.0或减1.0。称它们为一元运算符是因为它们用于单个变量,而前面讨论的二元运算符则连接两个表达式的值。一元递增运算符和一元递减运算符也可用于将字符变量在Unicode序列中向前或向后移动一个字符位置。例如,在下面的代码片段中,字符变量c的值从'e'递增为'f':递增和递减运算符可以以前缀或者后缀方式使用。如果运算符放在操作数之前(前缀模式),变量的递增或递减操作将在更新后的变量值被用于任何由它构成的赋值操作之前执行。例如,考虑下面的使用前缀递增运算符的代码片段,假设a和b在程序前面已经声明为int变量:上述代码执行后,变量a的值是2,变量b的值也是2。这是因为在第二行中变量a的递增(从1到2)发生在它的值赋给b之前。因此这行代码在逻辑上等价于下面两行代码: 另一方面,如果运算符放在操作数之后(后缀模式),递增或递减操作发生在原来的变量值被用于任何由它构成的赋值操作之后。看一下以后缀方式使用递增运算符的相同代码片段:上述代码执行后,变量b的值是1,而变量a的值是2。这是因为在第二行中变量a的递增(从1到2)发生在它的值赋给b之后。因此这行代码在逻辑上等价于下面两行代码:下面是一个稍微复杂一点例子,请阅读附加的注释以确保你能够明白x最终是如何被赋值为10的:稍后将会看到,递增和递减运算符通常和循环一起使用。2.9.2 关系和逻辑运算符逻辑表达式以指定的方式比较两个(简单或者复杂)表达式exp1和exp2,决议出一个boolean值true或者false。 Java提供了表2-3所示的关系运算符来创建逻辑表达式。表2-3 Java关系运算符运算符描 述exp1==exp2如果exp1等于exp2,值为true(注意使用双等号测试相等性)exp1>exp2如果exp1大于exp2,值为trueexp1>=exp2如果exp1大于等于exp2,值为trueexp1<exp2如果exp1小于exp2,值为trueexp1<=exp2如果exp1小于等于exp2,值为trueexp1!=exp2如果exp1不等于exp2,值为true!exp如果exp为false值为true,如果exp为true值为false除了关系运算符,Java还提供了用于组合/修饰逻辑表达式的逻辑运算符。表2-4列出了最常用的逻辑运算符。表2-4 Java逻辑运算符运算符描 述exp1&&exp2逻辑“与”,仅当exp1和exp2都为true时复合表达式值为trueexp1||exp2逻辑“或”,exp1或exp2值为true时复合表达式值为true!exp逻辑“非”,将逻辑表达式的值从true切换到false,反之亦然下面这个例子用逻辑“与”运算符来编程实现逻辑表达式“如果x大于2.0且y不等于4.0”:逻辑表达式常用于流程控制结构,本章稍后将进行讨论。2.9.3 表达式求值和运算符优先级如同本章前面提到的那样,任何复杂的表达式都可以用分层嵌套的小括号构成,例如(((8 * (y + z)) + y) x)。编译器通常按照从内到外,从左到右的顺序对这样的表达式求值。假设x、y、z按照下面的方式声明并初始化:下面的赋值语句右边的表达式:将像下面这样逐步求值:没有小括号时,根据运算符用于表达式求值的顺序,某些运算符具有高于其他运算符的优先级。例如,乘除法先于加减法执行。通过使用小括号可以强制改变运算符的优先级,括号内的运算符比括号外的先执行。考虑下面的代码片段:代码的第一行没有使用括号,乘法操作比加法操作先执行,因此整个表达式的值为2+12=14,就像我们将表达式明确地写成2+(3*4)一样,当然这样做没有必要。 在代码的第二行,括号被明确地放在操作2+3两边,因此加法操作将首先执行,然后求和结果乘以4作为整个表达式的值,即5*4=20。回到前面的例子注意到>和!=运算符优先级高于&&运算符,因此可以去掉嵌套的括号而变成下面这样:然而,额外的括号并不会对代码造成伤害,事实上它可以使表达式的目的更加清楚。2.9.4 表达式类型表达式类型是表达式最终求值结果的Java类型。例如给定下面的代码片段:表达式(x > 2.0) && (y != 4.0)求值结果为true,因此表达式(x > 2.0) && (y != 4.0)称为boolean型表达式。在下面的代码片段中:表达式((8 * (y + z)) + y) * x求值结果为42,因此表达式((8 * (y + z)) + y) * x称为整型表达式。
⑸ java中错误为表达式的类型必须是数组类型,但是它却解析为 String怎么改啊
importjava.util.Scanner;
importjavax.swing.JOptionPane;
publicclassjia{
publicstaticvoidmain(String[]args){
Scannerscan=newScanner(System.in);
Stringa=null;
intb=0;
ints=0;
doubleavg=0;
if(scan.hasNext()){
a=scan.next();
for(inti=0;i<a.length();i++){
if(a.charAt(i)>='0'&&a.charAt(i)<='9'){
b=b+a.charAt(i);
}
}
System.out.println(b);
}
⑹ java表达式解析问题,怎么解决
//表达式当成一段脚本来处理
publicclassTest{
publicstaticvoidmain(String[]args)throwsScriptException{
ScriptEngineManagermanager=newScriptEngineManager();
ScriptEnginese=manager.getEngineByName("js");
Stringstr="1+2*(3+6)-5/2";
Doubleresult=(Double)se.eval(str);
System.out.println(result);
}
}
⑺ JAVA语言中,什么叫表达式,请举例如何表示一个表达式
Java表达式是变量、常量、运算符、方法调用的序列,它执行指定的计算并返回某个确定的值。
其中,运算符按操作数的数目:有一元运算符(++、--)、二元运算符(+、-、>等等)和三元运算符(?:),它们分别对应一到三个操作数。
表达式一般按运算符来分:
算术表达式(float x=8.3f、i++)、
关系表达式(3>7、3<7)、
布尔逻辑表达式((5>4)&&true、!false)、
位运算表达式(a=34^3)、
赋值表达式、
条件表达式(b=100>89?a=ture:a=false)
以及复合表达式。
还有一种叫“表达式语句”,就是在表达式后加上分号作为语句来使用。(int i=123;)
⑻ 使用java开发的表达式解析框架有哪些
class BinaryExpressionParser : ExpressionParser<BinaryExpression>
{
public override void Where(BinaryExpression expr, ParserArgs args)
{
if (ExistsBracket(expr.Left))
{
args.Builder.Append(' ');
args.Builder.Append('(');
Parser.Where(expr.Left, args);
args.Builder.Append(')');
}
else
System.out.println( new ReadSingleLineNumber().test2());
}
MySqlLog test2(){
String log = "2018-03-21T13:46:01.185376Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).";
String[] head = log.substring(0, log.indexOf(']') + 1).split(" ");
return new MySqlLog(head[0].trim(), Integer.parseInt(head[1].trim()), head[2].trim().substring(head[2].trim().indexOf('[') + 1, head[2].trim().indexOf(']')), log.substring(log.indexOf(']') + 2).trim());
}
class MySqlLog{
String time;
int index;
String level;
String msg;
public MySqlLog(String time, int index, String level, String msg) {
this.time = time;
⑽ java解析字符串 算术表达式求值
Java 有一个jar包 叫groovy
groovy可以实现动态执行 String格式的算数表达式
publicstaticvoidmain(String[]args)throwsException{
Stringstr1="1+2*3";//表达式1固定表达式
GroovyShellgroovyShell=newGroovyShell();
Objectvalue=groovyShell.evaluate(str1);
System.out.println(value);
Stringstr2="A+B*C";//表达式2动态表达式
Bindingbinding=newBinding();
binding.setVariable("A",1);//表达式中所有的A替换为1
binding.setVariable("B",2);//表达式中所有的B替换为2
binding.setVariable("C",3);//表达式中所有的C替换为3
GroovyShellgroovyShell2=newGroovyShell(binding);
Objectvalue2=groovyShell2.evaluate(str2);//str2实际表达式为1+2*3
System.out.println(value2);
}