【发布时间】:2012-06-27 06:52:30
【问题描述】:
我有一个字符串输入,它代表一个公式,例如:
BMI = ( Weight / ( Height * Height ) ) * 703
我希望能够将所有合法变量提取到String[]
合法变量的确定规则与 Java 变量命名约定几乎相同,但只允许使用字母数字字符:
- 任何字母大写或小写,后面都可以跟一个数字
- 任何单词/文本
- 后跟数字的任何单词/文本
因此我希望输出如下所示:
BMI
Weight
Height
这是我目前的尝试:
/* helper method , find all variables in expression,
* Variables are defined a alphabetical characters a to z, or any word , variables cannot have numbers at the beginning
* using regex pattern "[A-Za-z0-9\\s]"
*/
public static List<String> variablesArray (String expression)
{
List<String> varList = null;
StringBuilder sb = null;
if (expression!=null)
{
sb = new StringBuilder();
//list that will contain encountered words,numbers, and white space
varList = new ArrayList<String>();
Pattern p = Pattern.compile("[A-Za-z0-9\\s]");
Matcher m = p.matcher(expression);
//while matches are found
while (m.find())
{
//add words/variables found in the expression
sb.append(m.group());
}//end while
//split the expression based on white space
String [] splitExpression = sb.toString().split("\\s");
for (int i=0; i<splitExpression.length; i++)
{
varList.add(splitExpression[i]);
}
}
return varList;
}
结果与我预想的不一样。我得到了额外的空行,得到了两次“身高”,而且不应该得到一个数字:
BMI
Weight
Height
Height
703
【问题讨论】:
-
好的,你的问题是什么?
-
我想要一个正则表达式,给定代表数学公式的字符串,一次提取所有变量
-
为什么是正则表达式?你使用了错误的工具来完成这项工作。对于数学表达式,您应该查看扫描仪/解析器组合。
-
我没有使用错误的工具,您不了解我的项目的全部范围,如果您阅读上面的粗体标准,问题就很清楚了!!!
标签: java regex pattern-matching