java - 拆分 Java 字符串

标签 java regex parsing context-free-grammar

我在使用 Java 正则表达式时遇到了一些麻烦。我有这样一个字符串

a + 4 * log(3/abs(1 – x)) + sen(-b/4 + PI)

我需要将其拆分为以下标记:

{"a", "+", "4", "*", "log", "(3/abs(1 - x))", "+", "sen", "(-b/4 + PI)"}

有什么想法吗?

我试过这个 PHP 正则表达式,但由于某些原因它不能在 Java 上运行

[a-z]+(\((?>[^()]+|(?1))*\))|[a-z]+|\d+|\/|\-|\*|\+

最佳答案

全部匹配与拆分

匹配和拆分是一枚硬币的两个面。这非常棘手,因为 Java 不支持递归并且我们有一些嵌套的括号。但这应该可以解决问题:

Java

\(.*?\)(?![^(]*\))|[^\s(]+

参见 demo .

遍历所有匹配项:

Pattern regex = Pattern.compile("\\(.*?\\)(?![^(]*\\))|[^\\s(]+");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    // the match: regexMatcher.group()
} 

解释

  • \(.*?\)(?![^(]*\)) 匹配左括号和右括号之前的所有内容,后跟一个左括号和更多右括号标准杆。这适用于表达式中的 (simple(nesting)),但不适用于 (this(kind)of(nesting))(请参阅 PHP 解决方案)<
  • | 或者...
  • [^\s(]+ 任何不是空格或开头的字符

带递归的 PHP 选项

在 PHP 中,我们可以使用递归来更精确地匹配嵌套结构(这将克服 Java 中 (this(kind)of(nesting)) 的问题:

(\((?:[^()]++|(?1))*\))|[^\s(]+

关于java - 拆分 Java 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24541956/

相关文章:

java - 使用 Java ServiceLoader 结果 NoSuchElementException 错误

python - 子列表的正则表达式

java - 正则表达式匹配多个 if then else 条件

java - 以 0.5 为增量检查 1-10 的正则表达式?

parsing - 使用 flex/antlr 进行部分解析

c++ - 解析csv文件c++

java - 通过 jdbc 通过准备好的语句传递 SQL 命令时出错

java - 构建 eclipselink-2.6.0 因缺少需求而失败

java - Eclipse:代码完成的黑名单类型

java - 如何以 scala 方式解析基于行的文本文件(.mht)?