我需要使用正则表达式来跟随文本。括号不是嵌套的。
{ ... bla ... {text} jdjdj ... { kdkdkdkd aaa { abc }
如果我使用\{(.*?)\}
,那么有两组:
... bla ... {text
kdkdkdkd aaa { abc
但我需要
text
abc
是否可以用Java编写这样的Regex?
编辑:实际的括号是@{
和}@~enc~
实际字符串:
@{ ... bla ... @{text}@~enc~ jdjdj ... @{ kdkdkdkd aaa @{ abc }@~enc~
答案 0 :(得分:3)
您需要使用negated character class [^{}]
:
\{([^{}]*)}
[^{}]
字符类匹配除{
和}
之外的任何字符。
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()
删除捕获中的尾随/前导空格。
要匹配多字符分隔符之间的文本,您可以使用tempered greedy token:
Pattern pattern = Pattern.compile("(?s)@\\{((?:(?!@\\{|}@~enc~).)*)}@~enc~");
^^^^^^^^^^^^^^^^^^^^^^
见another demo。 (?s)
修饰符(相当于设置Pattern.DOTALL
标记)也会使.
匹配换行符。
注意:不要忘记在Java正则表达式中转义{
符号,并且不必转义}
。