正则表达式用于最后一个有效括号之间的文本

时间:2016-02-10 08:21:02

标签: java regex

我需要使用正则表达式来跟随文本。括号不是嵌套的。

{ ... bla ... {text} jdjdj ... { kdkdkdkd aaa { abc }

如果我使用\{(.*?)\},那么有两组:

... bla ... {text
kdkdkdkd aaa { abc

但我需要

text
abc

是否可以用Java编写这样的Regex?

编辑:实际的括号是@{}@~enc~

实际字符串:

@{ ... bla ... @{text}@~enc~ jdjdj ... @{ kdkdkdkd aaa @{ abc }@~enc~

1 个答案:

答案 0 :(得分:3)

案例1.单字符分隔符

您需要使用negated character class [^{}]

\{([^{}]*)}

[^{}]字符类匹配除{}之外的任何字符。

Java demo

String s = "{ ... bla ... {text} jdjdj ... { kdkdkdkd aaa { abc }";
Pattern pattern = Pattern.compile("\\{([^{}]*)}");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(1).trim()); 
} 

请注意,您可以使用String#trim()删除捕获中的尾随/前导空格。

案例2.多字符分隔符

要匹配多字符分隔符之间的文本,您可以使用tempered greedy token

Pattern pattern = Pattern.compile("(?s)@\\{((?:(?!@\\{|}@~enc~).)*)}@~enc~");
                                            ^^^^^^^^^^^^^^^^^^^^^^

another demo(?s)修饰符(相当于设置Pattern.DOTALL标记)也会使.匹配换行符。

注意:不要忘记在Java正则表达式中转义{符号,并且不必转义}