【发布时间】:2011-05-19 18:46:58
【问题描述】:
我有一些类似的字符串:
(((a * b) + c) * d)
并希望使用 java 正则表达式捕获带括号的组。我认为这个简单的正则表达式
Pattern p = Pattern.compile("\\((.*)\\)",Pattern.DOTALL);
会做这项工作,但它不会。
这有什么问题?
【问题讨论】:
我有一些类似的字符串:
(((a * b) + c) * d)
并希望使用 java 正则表达式捕获带括号的组。我认为这个简单的正则表达式
Pattern p = Pattern.compile("\\((.*)\\)",Pattern.DOTALL);
会做这项工作,但它不会。
这有什么问题?
【问题讨论】:
不幸的是,您尝试使用正则表达式定义的语言闻起来很不规则,即正则表达式不适合这种类型的表达式。 (准确地说,“平衡括号”不是你可以用正则表达式定义的。)
如果您只是想在示例中找到子字符串 a * b,则应该使用以下表达式:
Pattern p = Pattern.compile("\\(([^()]*)\\)");
Matcher m = p.matcher("(((a * b) * ) + c) * d)");
if (m.find())
System.out.println(m.group(1)); // prints "a * b"
【讨论】:
正则表达式不擅长提取括号等平衡对。你最好在没有正则表达式的情况下解析字符串。
【讨论】:
"élève" 匹配\b\w+\b ANYWHERE 不是诀窍。不让"\t\n " 不正确地匹配^\s*\S+$ 不是诀窍。 是一个技巧是处理Java的破碎!
我相信使用 RegEx 处理嵌套结构几乎是不可能的。更好地遍历每个字符并跟踪您有多少个左括号。
此外,如果您的目标是评估 infix notation 中的数学表达式,则使用 shunting algorithm 可能会更成功。
【讨论】: