毫无疑问,SO可以解决我的特定问题。我对正则表达式知之甚少。为此,我正在使用 Regex 类在 Java 中构建表达式解析器。我想从表达式中提取操作数、参数、运算符、符号和函数名,然后保存到 ArrayList。目前我正在使用这个逻辑
String string = "2!+atan2(3+9,2+3)-2*PI+3/3-9-12%3*sin(9-9)+(2+6/2)" //This is just for testing purpose later on it will be provided by user
List<String> res = new ArrayList<>();
Pattern pattern = Pattern.compile((\\Q^\\E|\\Q/\\E|\\Q-\\E|\\Q-\\E|\\Q+\\E|\\Q*\\E|\\Q)\\E|\\Q)\\E|\\Q(\\E|\\Q(\\E|\\Q%\\E|\\Q!\\E)) //This string was build in a function where operator names were provided. Its mean that user can add custom operators and custom functions
Matcher m = pattern.matcher(string);
int pos = 0;
while (m.find())
{
if (pos != m.start())
{
res.add(string.substring(pos, m.start()))
}
res.add(m.group())
pos = m.end();
}
if (pos != string.length())
{
addToTokens(res, string.substring(pos));
}
for(String s : res)
{
System.out.println(s);
}
输出:
2
!
+
atan2
(
3
+
9
,
2
+
3
)
-
2
*
PI
+
3
/
3
-
9
-
12
%
3
*
sin
(
9
-
9
)
+
(
2
+
6
/
2
)
问题是现在表达式可以包含用户定义格式的矩阵。在函数的情况下,我想将每个矩阵视为操作数或参数。
输入 1:
String input_1 = "2+3-9*[{2+3,2,6},{7,2+3,2+3i}]+9*6"
输出应该是:
2
+
3
-
9
*
[{2+3,2,6},{7,2+3,2+3i}]
+
9
*
6
输入 2:
String input_2 = "{[2,5][9/8,func(2+3)]}+9*8/5"
输出应该是:
{[2,5][9/8,func(2+3)]}
+
9
*
8
/
5
输入 3:
String input_3 = "<[2,9,2.36][2,3,2!]>*<[2,3,9][23+9*8/8,2,3]>"
输出应该是:
<[2,9,2.36][2,3,2!]>
*
<[2,3,9][23+9*8/8,2,3]>
我希望现在 ArrayList 应该包含每个索引处的每个操作数、运算符、参数、函数和符号。如何使用正则表达式实现我想要的输出。不需要表达式验证。