[英]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.