我正在尝试编写一个正则表达式/方法,它从表示“数学/代数表达式”的输入字符串和一个看起来像“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