我想知道匹配{}
内所有内容的正则表达式。该字符串可能包含嵌套的{}
;我不在乎他们。
示例字符串:{Don't} trust me. I'm a {very very {evil}} good guy.
我希望结果为Don't
和very very {evil}
。
我目前唯一的正则表达式是/{\w+}/
,它只捕获evil
。如果它没有撇号,它也返回Dont
。
答案 0 :(得分:4)
由于您使用嵌套大括号,因此在大括号之间提取部分的正则表达式不如:\{.+?\}
。此正则表达式将在它找到的第一个}
处停止。因此,对于嵌套大括号,它不会表现得很好。为此,您需要一个稍微复杂的正则表达式。但是,我建议不要将Regex用于此类问题。正则表达式不足以考虑匹配括号对。他们只能解析常规语言。对于任何高于此值的东西,你应该编写自己的解析器。
话虽这么说,你可以试试这个正则表达式: -
"/\{((?:[^{}]*\{[^{}]*\})*[^{}]*?)\}/"
获得group 1
。这将考虑您的嵌套大括号,只要它们是平衡的。并且你没有将大括号作为实际字符串的一部分。
除了上述解决方案之外,您还可以查看此示例解析器,该解析器适用于您的特定情况。事实上,只要你有平衡的大括号,这应该适用于任何形式的嵌套大括号: -
String str = "{Don't} trust me. I'm a {very very {evil}} good guy.";
List<String> words = new ArrayList<>();
int openCount = 0;
StringBuilder builder = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch == '{') {
if (openCount == 1) {
builder.append(ch);
}
openCount += 1;
} else if (ch == '}') {
if (openCount > 1) {
openCount--;
builder.append(ch);
} else {
words.add(builder.toString());
openCount--;
builder = new StringBuilder();
}
} else {
if (openCount >= 1) {
builder.append(ch);
}
}
}
System.out.println(words);
输出: -
[Don't, very very {evil}]
答案 1 :(得分:0)
@Rohit是正确的。
如果使用js或java,而不是嵌套括号的深度,则必须编写自己的解析器。
但是如果你使用C#或perl,你可以使用“balance group”来实现这一点,这是一个高级正则表达式功能,js不支持。 :(