【问题标题】:Regex to select latest expression in math formula to change sign正则表达式选择数学公式中的最新表达式以更改符号
【发布时间】:2018-11-15 14:49:48
【问题描述】:

我想要一个可以检测最后一个数学表达式的正则表达式,以便更改该表达式的符号,例如:

5 --> -5

-5 --> 5

5+2*cos(10) --> 5-2*cos(10)

5-cos(10+2) --> 5+cos(10+2)

我仍然无法创建任何可以匹配最后一个表达式的正则表达式。我创建了这个正则表达式(\+[(cos|sin|tan)])+(.*[0-9]*.),但它只在存在 sin/cos 或 tan 时选择最后一个表达式。

【问题讨论】:

  • 我认为正则表达式不能解决整个问题。您需要构建一棵树来表示所有操作以选择最后一个。
  • 嗯,好的,谢谢。我想也许我错过了一些可能有帮助的正则表达式功能。
  • 这将是一件疯狂的事情,但我看到的唯一正则表达式方法是构建一个具有替代匹配并捕获各种上下文的正则表达式,并在匹配评估器部分分析匹配结构并相应地替换。可能处理所有上下文的正则表达式是(?:cos|sin|tan)\([^()]*\)|^(-)|^(\d)|([-+])
  • @WiktorStribiżew 谢谢我并没有义务遵循正则表达式我会尝试树解析。
  • 为什么是正则表达式?您可以排序并取最后一个条目。

标签: java regex kotlin


【解决方案1】:

很抱歉迟到(难以置信地),但这是我的解决方案:

String str = "5*10/2+cos(54/90)", regex = "(\\+|-)(?=(?:[a-zA-Z]*\\(.*?\\))|[0-9^*/]+$)";
Pattern pat = Pattern.compile(regex);
Matcher m = pat.matcher(str);
String r = "";
if(m.find())
{
    r = m.group(1).equals("+")?"-":"+";
}
str = str.replaceAll(regex, r);
System.out.println(str);

顺便说一句,我使用 BlueJ 作为 IDE。

这是一个现场演示:https://regex101.com/r/3EM9Ix/1

解释

(\\+|-) 选择所需的运算符,“+”或“-” (?=(?:[a-zA-Z]*\\(.*?\\))|[0-9^*/]+$) 是一个正则表达式,用于检查运算符后面是否跟随有字母或更多数字的函数

【讨论】:

    猜你喜欢
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多