【发布时间】:2015-04-09 09:58:36
【问题描述】:
我正在尝试提取两个大括号内的文本,例如给定以下字符串
s = "Some text \test{a}{b}{c} even more "
我只想将 b 和 c 中的所有内容提取为字符串。此外,b 和 c 中可能还有更多的大括号。我也喜欢提取这段文字。
我一直在研究 Java 中的一些函数。如下
String in = "Item(s): \test{x}{y}{z in {X} }";
Pattern p = Pattern.compile("\\{(.*?)\\}");
Matcher m = p.matcher(in);
while(m.find()) {
System.out.println(m.group(1));
}
但这给了我大括号中的所有内容,即
a="x"
b="y"
c=" z in {X"
补充问题: 如果字符串有多个不同的花括号如下
s1=" Some text \test{a}{b}{c} even more \foo{d}{e}"
但我仍然只想要 b 和 c。这很容易实现吗?对于这种特殊情况,我们可以只进行第 2 和第 3 次迭代,但一般来说,如果有一个带有多个 \test{}{}{} 的较长文本,它就不那么简单了。
s2 = " Some text \test{a1}{b1}{c1} even more \foo{d}{e} and more \test{a2}{b2}{c2} more plus mehr mas"
然后我想要 b1、c1 和 b2 和 c2 对于这种情况,我们可以对每个“\test”使用 if 条件检查,并且只进行迭代 2 和 3,但这非常难看。
【问题讨论】:
-
规则是什么?为什么要排除
x?如果您想忽略第一个结果,只需在第一次迭代中忽略它.. -
"x" 是一些不必要的字符串。好的,我试试看。
-
Java 的正则表达式不能很好地处理嵌套的东西......你必须使用某种状态机(循环遍历每个字符,或者至少保持开始和结束大括号的计数你看)以获得正确的匹配。
-
谢谢杰瑞。这就是我所害怕的。有没有优雅的方法可以遍历每个字符并找到我的模式?
-
stackoverflow.com/questions/26974739/…(有点复杂)。首先解析最里面的
(...),例如通过递归。
标签: java regex pattern-matching