【问题标题】:Pattern extract between curly brackets大括号之间的模式提取
【发布时间】: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


【解决方案1】:

如果您使用的是 apache commons lang API,请尝试 StringUtils.substringsBetween

String[] bet = StringUtils.substringsBetween("Some text \test{a}{b}{c} even more ", "{", "}");
System.out.println(Arrays.asList(bet))

;

【讨论】:

    【解决方案2】:

    如果你只有一个嵌套层,你可以试试:

    [{]([^{}]+|[^{}]*[{][^{}]*[}][^{}]*)[}]
    

    【讨论】:

    • 托托。我已经测试了代码并且运行良好。当我进行更多测试时,我会发布结果。
    • 我之前没有想太深。实际上,您可以将其进一步简化为[{]([^{}]++|[{][^{}]*[}])*[}](尽管这将允许{})。
    猜你喜欢
    • 2014-08-07
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多