我在使用 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/