Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法在字符值之前停止正则表达式,然后在该字符值之后启动另一个正则表达式?_Java_Regex - Fatal编程技术网

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);
}