簡體   English   中英

正則表達式模式以匹配並從數學/代數表達式中提取變量

[英]Regex pattern to match & extract variables from math/algebraic expression

我正在嘗試編寫一種正則表達式/方法,該方法從代表“數學/代數表達式”的輸入字符串中提取變量,以及一個看起來像“ 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:

輸入:[(體重/體重)*體重] * 703

輸出:

變量:PROPERTY(同重量)

變量:PROPERTY(ibdheight)

例#2:

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

輸出:

變量:ibdweight

變量:ibdheight

例#3:

輸入:[屬性(同重量)/ [屬性(同重)*屬性(同重)] * 703

輸出:

變量:PROPERTY(同重量)

變量: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_]*)

更好的版本是:
(PROPERTY\\([A-Za-z]\\w*\\))|([A-Za-z]\\w*)

問題的一部分是您考慮正則表達式的方式。

舉個例子:

    [A-Za-zPROPERTY(?)_]

本質上,這是一個“字符類”,它沒有您所期望的那樣。 它將匹配輸入字符串中與該類中任何字符匹配的任何單個字符。 它不會將PROPERTY視為一個單獨的實體,而是將其視為單獨的大寫字母(無論如何,它們已經包含在AZ中。而且,在字符類中使用(?)會匹配“(”,我確定這不是什么)你要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM