Java 有没有办法在字符值之前停止正则表达式,然后在该字符值之后启动另一个正则表达式?
我试图删除字符前面的数字,例如Java 有没有办法在字符值之前停止正则表达式,然后在该字符值之后启动另一个正则表达式?,java,regex,Java,Regex,我试图删除字符前面的数字,例如a-z或*,/,+,-,然后删除该字符后面但不同字符之前的任何数字。这是我的 s= s.replaceAll("(\\d+)", ""); s= s.replace("*", r.toString()); 其中,s是我需要读取的字符串,r是操作的结果 *是任意的。它可以是任何字符。前文 问题是它会删除字符串中的每个数字 如果我使用以下输入进行一次迭代: 26 + 4 - 2 程序返回以下内容: 30 - 它删除所有三个数字,然
a-z
或*
,/
,+
,-
,然后删除该字符后面但不同字符之前的任何数字。这是我的
s= s.replaceAll("(\\d+)", "");
s= s.replace("*", r.toString());
其中,s
是我需要读取的字符串,r
是操作的结果
*
是任意的。它可以是任何字符。前文
问题是它会删除字符串中的每个数字
如果我使用以下输入进行一次迭代:
26 + 4 - 2
程序返回以下内容:
30 -
它删除所有三个数字,然后将“+”替换为30
我想将其更改为类似于此(一次迭代):
第一个正则表达式将删除第一组数字
+ 4 - 2
第二个将删除运算符后面但在下一个运算符之前的数字
+ - 2
下一条语句将用表达式的结果替换运算符
30 - 2
对于其他函数(如正弦、余弦等)的问题,我也希望如此
注:正弦为“a”
“Sin-pi”与“a-pi”相同
在一次迭代之后,它应该看起来像
a pi + 2
a + 2
0 + 2
下面是一个代码示例
这就是“情况”
case'*':
{
int m=n+1;
而(m<结果长度){
if(result[m]!='*'&&result[m]!='/'&&result[m]!='+'&&result[m]!='-'){//检查项目是否为数字
char ch2=result[m];//使数字成为一个字符
number3+=新字符串(new char[]{ch2});//将字符组合成字符串。例如:“2'+'3'=“23”。
++m、 }
否则{
打破
}}
resultNumber=(Double.parseDouble(number2)*Double.parseDouble(number3));/“number2”保存运算符前面的数字值。示例:此数字-->“3”*“23”
等式=等式.replaceAll(“(\\d+”,”);//我将首先建议两种替代方法,然后按原样回答您的问题
也许没有正则表达式会更好
我对你的应用程序有很多疑问。一个合适的,再加上一个非常简单的,可能会比你的代码做得更好,并给出更清晰的错误信息
匹配所有操作数
即使要使用正则表达式,在一次传递中匹配两个操作数也可能更有意义。例如,匹配(\d+)\s*\*\s*(\d+)
匹配正好两个数字的乘法。您可以先搜索匹配项,然后从捕获组中提取操作数,然后计算结果值,最后将子字符串粘合在一起,包括结果:
// Multiplication of unparenthesized integers
Pattern p = Pattern.compile("(\\d+)\\s*\\*\\s*(\\d+)");
Matcher m = p.matcher(s);
while (m.find()) {
int a = Integer.parseInt(m.group(1));
int b = Integer.parseInt(m.group(2));
s = s.substring(0, m.start(1)) + (a*b) + s.substring(m.end(2));
m.reset(s);
}
按照标题中的措辞回答问题
关于你问题的确切表述:
有没有办法在字符值之前停止正则表达式,然后在该字符值之后启动另一个正则表达式
如果您想让正则表达式在输入中的给定字符后不匹配,可以通过一个否定的look-behind断言来实现。同样,要仅在给定字符后匹配,可以使用肯定的look-behind断言
因此,以(?)开头的正则表达式只能匹配第一次出现的“*”
,而以开头的正则表达式(?)?
但是,确保这些匹配符合您心目中的数学可能非常棘手。非常不清楚。您到底想用正则表达式做什么?您似乎要用它们的计算值替换表达式。这不是正则表达式所做的事情(算术表达式的计算结果)。问题到底是什么?我所能解释的就是你需要做数学运算和匹配模式的东西。这种评估通常应该通过将输入字符串拆分为单词,然后将它们放入堆栈中来完成。你使用正则表达式有什么特殊原因吗?你正在尝试做标记器的工作(也称为lexer)/parser程序与正则表达式。我以前尝试过只使用正则表达式和字符串替换的计算器,虽然它几乎可以工作,但它总是有一些奇怪的优先角情况,我从来没有100%相信我已经解决了。因此,我强烈建议您为Java找到一个好的解析器库,并为您的计算器编写一个解析器,就像我最终完成的那样使用Python及其优秀的PLY库进行操作。:)很抱歉,这一点太不清楚了。我总是发现这样的问题在措辞上有问题。我想做的是用java制作一个计算器。我所做的数学部分,我只需要删除留下的数字。我对编程比较陌生,我不完全理解标记器或堆栈。我看到正则表达式可以删除ete特定字符类型,我想知道是否有一种方法可以在特定字符处停止它,这样它就不会删除该特定字符后的数字。我会记住标记器方法,但另一种方法也解决了我遇到的问题,我想我更了解它。谢谢!
case '*':
{
int m = n + 1;
while (m < result.length){
if (result[m] != '*' && result[m] != '/' && result[m] != '+' && result[m] != '-'){ //checks the item to see if it is numeric
char ch2 = result[m]; //makes the number a character
number3 += new String(new char[]{ch2}); //combines the character into a string. For example: '2' + '3' = "23".
++m;}
else {
break;
}}
resultNumber = (Double.parseDouble(number2) * Double.parseDouble(number3)); //"number2" holds the value of the numbers before the operator. Example: This number ----> "3" '*' "23"
equation = equation.replaceAll("(\\d+)", ""); // <---- Line I pulled out earlier that I want to change.
equation = equation.replace("*", resultNumber.toString()); // <----- Line I pulled out earlier
result = equation.toCharArray();
number3 = ""; //erases any number held
number2 = ""; //erases any number held
++n;
break;
}
// Multiplication of unparenthesized integers
Pattern p = Pattern.compile("(\\d+)\\s*\\*\\s*(\\d+)");
Matcher m = p.matcher(s);
while (m.find()) {
int a = Integer.parseInt(m.group(1));
int b = Integer.parseInt(m.group(2));
s = s.substring(0, m.start(1)) + (a*b) + s.substring(m.end(2));
m.reset(s);
}