java - 符号旁边的 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", ")"]
解决方案
您可以尝试将这样的正则表达式传递给split()
方法:
String[] words=line.split("((?=[=+\\-*/()])|(?<=[=+\\-*/()]))");
例子:
"z=x + (y-56)/(4+2*x)" => String[18] { "z", "=", "x ", "+", " ", "(", "y", "-", "56", ")", "/", "(", "4", "+", "2", "*", "x", ")" }
如您所见,它也可以处理空格,但是您必须在拆分后将其删除。
推荐阅读
- excel - Excel中时间戳的比较
- python-3.x - 如何在 Python 中使用无头模式和 selenium webdriver 节省抓取数据的时间
- c++ - 如何修复静态断言编译错误 C2338
- jquery - 如何使用 ansible 模块从 MySQL 查询结果中过滤和检索数据
- selenium - 机器人框架:批量运行测试用例会失败,而运行单个测试用例可以
- android - Gitlab CI 管道因空指针异常而失败
- mongodb - MongoDB聚合 - 从另一个集合中的值替换集合中的字段
- c++ - CMAKE 静态库构建良好,但共享库链接失败
- java - Java比较csv文件值
- reactjs - 带有 react-router、redux 和 Material UI 的 CRA - 服务器端渲染