从数学/代数表达式中解析和提取变量

时间:2016-10-04 09:33:24

标签: regex

给定表示数学表达式的字符串

(((x + temp) * temp_2) / 2_temp) + x3

我需要提取除数字和运算符之外的所有变量。 只允许使用圆括号。 特别是,可以提取的有效变量是:

x
x23
x_23
2_temp
2temp
2_
temp
temp_2
temp

但不是

2
15

因此,一般来说,任何变量都可以以任何字符开头,但如果它以数字开头,那么它必须包含至少一个字母。

我试过这个正则表达式

matcher=Pattern.compile("([a-zA-Z0-9_]+\\w*?[a-zA-Z0-9_]*\\w*?)").matcher(equation);

但是,例如,提取了15个。

任何人都可以帮助我?

提前致谢

2 个答案:

答案 0 :(得分:1)

根据您的描述,您似乎想要提取以字母数字开头的实体,然后提取0个字符。

您可以使用

\b(?!\d+\b)[a-zA-Z0-9]\w*\b

请参阅regex demo

如果您允许这些变量以下划线开头,请使用\b(?!\d+\b)\w+\b

这里的要点是(?!\d+\b)否定前瞻不允许字边界之间的字符串只包含数字。

详细

  • \b - 字边界
  • (?!\d+\b) - 限制:必须没有1+位后跟一个字边界
  • [a-zA-Z0-9] - 一个字母数字(在Java中,您也可以使用\p{Alnum}
  • \w* - 0个或更多单词字符
  • \b - 尾随字边界。

在Java中,在定义模式时不要忘记使用双反斜杠:

String pat = "\\b(?!\\d+\\b)[a-zA-Z0-9]\\w*\\b";

答案 1 :(得分:0)

包含至少一个字母的字母数字字符串:

[a-zA-Z0-9_]*[a-zA-Z][a-zA-Z0-9_]*