Имена разделенных регулярных выражений Java рядом с символами

#java #regex #string

Вопрос:

Я пытаюсь написать интерпретатор для грамматики формы Backus Naur. Ниже приводится грамматика:

 <statement> ::= <assignment> | “PRINT” “(” <expression> “)”
<assignment>    ::= <variable> = <expression>
<expression>    ::= <term> <expression*>
<expression*>   ::= “ ” <expression> | “-” <expression> | “”
<term>  ::= <factor> <term*>
<term*> ::= “*” <term> | “/” <term> | “”
<factor>    ::= <number> | <variable> | “(” <expression> “)”
<variable>  ::= <lowercase> <variable*>
<variable*> ::= <variable> | “”
<number>    ::= <digit> <number*>
<number*>   ::= <number> | “”
 

Я пытаюсь написать код, который определяет, является ли строка выражением. Моя идея заключается в том, что я беру строку и использую функцию разделения, чтобы разделить все отдельные слова и символы. Я делаю это, делая что-то вроде этого String[] words = line.split("\s ");

Когда я это сделаю, он превратит строку, как String line = "y = x 12 * z" в String[] words = ["y", "=", "x", " ", "12", "z"] . Для меня это не проблема. Проблема возникает, однако, когда у меня есть выражение как таковое String line = "x=12 z" , Когда я пытаюсь разделить его с помощью своего регулярного выражения, оно даст мне String[] words = ["x=12 z"] . Есть ли какой-либо способ, которым я могу разделить строку на слова, где она превратит любой из следующих символов в свои собственные слова в массиве: , -, *, /, =, (, )

Например, если у меня есть строка String line = "x = z 12 * y -(z *var )" , она станет String[] words = ["x", "=", "z", " ", "12", "*", "y", "-", "(", "z", "*","var", ")"]

Ответ №1:

Вы можете попробовать передать регулярное выражение, подобное этому, в split() метод:

 String[] words=line.split("((?=[= \-*/()])|(?<=[= \-*/()]))");
 

Пример:

 "z=x   (y-56)/(4 2*x)" => String[18] { "z", "=", "x ", " ", " ", "(", "y", "-", "56", ")", "/", "(", "4", " ", "2", "*", "x", ")" }
 

Как вы видите, он также обрабатывает пробелы, но вы должны удалить их после разделения.