首页 > 解决方案 > 符号旁边的 Java 拆分正则表达式名称

问题描述

我正在尝试为 Backus Naur Form 语法编写解释器。以下是语法:

<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> | “”

我正在尝试编写确定字符串是否为表达式的代码。我的想法是获取字符串并使用 split 函数将所有单独的单词和符号分开。我通过做这样的事情来做到这一点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", ")"]

标签: javaregexstring

解决方案


您可以尝试将这样的正则表达式传递给split()方法:

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

例子:

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

如您所见,它也可以处理空格,但是您必须在拆分后将其删除。


推荐阅读