2

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

我对变量的定义:

1) 只能包含字母数字值

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

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

4) 一个变量,例如“X”,可以被这个字符串“PROPERTY(X)”包围,因此变量变成了“PROPERTY(X)”</p>

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

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

输出:

变量:属性(ibdweight)

变量:属性(ibdheight)

例#2:

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

输出:

变量:ibdweight

变量:ibdheight

例如#3:

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

输出:

变量:属性(ibdweight)

变量:属性(ibdheight)

例如 #:4

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

问题是括号被选为变量:

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

输出:

多变的 : (

变量:质量

变量:加速度

变量:随便

多变的 : ))

例如 #:5

问题是括号被选为变量:

输入:(底 * 高)/ 2

输出:

多变的 : (

变量:基础

变量:高度

多变的 : )

例如 #:6

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

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

输出:

多变的 : (((

变量:var

变量:var2

多变的 : )

变量:var3

多变的 : (

变量:var1

变量:var4

变量:var5)

变量:var6

4

2 回答 2

4

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

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

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

于 2012-06-28T20:27:05.960 回答
0

部分问题是您考虑正则表达式的方式。

举个例子:

    [A-Za-zPROPERTY(?)_]

这本质上是一个“字符类”,它的行为方式与您期望的不同。它将匹配输入字符串中与类中的任何字符匹配的任何单个字符。它不会将 PROPERTY 视为单个实体,而是将其视为单独的大写字母(无论如何,它们已经包含在 AZ 中。此外,在您的字符类中包含 (?) 匹配“(”,我确信这不是什么)你要。

于 2012-06-28T20:26:02.967 回答