Никакой вопрос о SO не касается моей конкретной проблемы. Я мало знаю о регулярном выражении. Я создаю парсер выражений в Java с использованием класса Regex для этой цели. Я хочу извлечь операнды, аргументы, операторы, символы и имена функций из выражения, а затем сохранить в 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
)
Проблема заключается в том, что теперь выражение может содержать матрицу с определенным пользователем форматом. Я хочу рассматривать каждую Матрицу как Операнд или Аргумент в случае функций.
Input 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
Input 2:
String input_2 = "{[2,5][9/8,func(2+3)]}+9*8/5"
Выход Должно быть:
{[2,5][9/8,func(2+3)]}
+
9
*
8
/
5
Input 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 должен содержать каждый операнд оператор, аргументы функции и символы в каждом индексе. Как я могу достичь желаемого результата, используя регулярное выражение. Валидация выражений не требуется.
@trashgod I подумайте, что ссылка, которую вы предоставили, не имеет отношения к моей проблеме. –