java - 用于从数学/代数表达式中匹配和提取变量的正则表达式模式

标签 java regex pattern-matching

我正在尝试编写一个正则表达式/方法,从表示“数学/代数表达式”的输入字符串中提取变量,以及一个类似于“PROPERTY(AnyOtherAplhaNumeric)”的特殊模式,它也可以是一个变量。

我对变量的定义:

1) 只能包含字母数字值

2) 必须至少 1 个字符或更多

3) 不能以数字开头,必须以 [A-Za-z] 开头

4) 变量,例如“X”,可以被字符串“PROPERTY(X)”包围,因此变量变为“PROPERTY(X)”

我当前的方法和正则表达式(仅在某些情况下有效):

public Set<String> extractUniqueVarsFromExpression(String expression) {
        Set<String> varsSet = null;
        Pattern p = null;
        Matcher m = null;
        System.out.println(expression);
        if (expression != null) {
            varsSet = new java.util.LinkedHashSet<String>();
            //"[A-Za-zPROPERTY(?)_][A-Za-z0-9PROPERTY(?)_]*||[A-Za-z_][A-Za-z0-9_]*"
            //"[[A-Za-z_][A-Za-z0-9_]*"
            p = Pattern.compile("[A-Za-zPROPERTY(?)_][A-Za-z0-9PROPERTY(?)_]*||[A-Za-z_][A-Za-z0-9_]*",
                    Pattern.CASE_INSENSITIVE);
            m = p.matcher(expression);
            while (m.find()) {

                    String group = m.group().trim();
                //do not add duplicates     

                         if (!varsSet.contains(group)) 
                         {
                    varsSet.add(group);

                    System.out.println(" Variable : " + group);
                         }//end if not duplicate 

            }// end while

        }
        System.out.println();
        return varsSet;
    }

示例/案例:

例如#1:

输入:[(ibdweight/ibdheight) * ibdheight] * 703

输出:

变量:PROPERTY(ibdweight)

变量:PROPERTY(ibdheight)

示例#2:

输入:[ibdweight/ibdheight * ibdheight] * 703

输出:

变量:ibdweight

变量:ibdheight

示例#3:

输入:[属性(ibdweight)/[属性(ibdheight) * 属性(ibdheight)] * 703

输出:

变量:PROPERTY(ibdweight)

变量:PROPERTY(ibdheight)

例如#:4

这些是不起作用的情况(示例 4 到 6):

问题是括号被当作变量:

输入:(质量 *(加速度 + 任意))

输出:

变量:(

变量:质量

变量:加速度

变量:任意

变量:))

例如#:5

问题是括号被当作变量:

输入:(基础 * 高度)/2

输出:

变量:(

变量:基础

变量:高度

变量:)

例如#:6

问题是括号被拾取为变量或附加到变量:

输入:[((( var * var2 ) var3 ) + ( var1/var4 ) var5)/var6 ]

输出:

变量:(((

变量:var

变量:var2

变量:)

变量:var3

变量:(

变量:var1

变量:var4

变量:var5)

变量:var6

最佳答案

正则表达式的问题在于括号内有括号和括号内的单词“PROPERTY”。括号用于指定一组字符,而不是字符串,其中的任何成员都将匹配。

一个适合您的简单(尽管可能不是最佳)变体是:
(属性\([A-Za-z][A-Za-z0-9_]*\))|([A-Za-z][A-Za-z0-9_]*)

稍微好一点的版本是:
(属性\([A-Za-z]\w*\))|([A-Za-z]\w*)

关于java - 用于从数学/代数表达式中匹配和提取变量的正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11252091/

相关文章:

python - 我正在尝试使用 python 的 re 模块执行某些模式匹配

java - Java中通过Arrays.toString使循环结果出现在数组中

java - XSLT - 删除空节点

Java/Android 正则表达式允许可能包含撇号和/或连字符的名称

正则表达式:确定一个字符是否出现在另一个字符第一次出现之前

F# 常量模式匹配和检查消除

c# - 用另一种语言创建相同的函数

java - Rhino:在 Javascript 实现中访问 Java 接口(interface)变量

python - 在python中使用正则表达式提取数据

java - 提取消息中包含连接字符的字符串