我想知道匹配里面所有东西的正则表达式{}
。字符串可能包含嵌套的{}
; 我不在乎他们。
示例字符串:{Don't} trust me. I'm a {very very {evil}} good guy.
我希望结果是Don't
and very very {evil}
。
我目前拥有的唯一正则表达式是/{\w+}/
仅捕获evil
. Dont
如果它没有撇号,它也会返回。
我想知道匹配里面所有东西的正则表达式{}
。字符串可能包含嵌套的{}
; 我不在乎他们。
示例字符串:{Don't} trust me. I'm a {very very {evil}} good guy.
我希望结果是Don't
and very very {evil}
。
我目前拥有的唯一正则表达式是/{\w+}/
仅捕获evil
. Dont
如果它没有撇号,它也会返回。
由于您有嵌套的大括号,因此提取大括号之间部分的正则表达式不像: - 那样直接\{.+?\}
。}
这个正则表达式将在它找到的第一个位置停止。因此,对于嵌套大括号,它不会表现得很好。为此,您需要一个稍微复杂的正则表达式。但是,我建议不要将 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}]
@Rohit 是正确的。
如果您使用 js 或 java,并且没有嵌套括号的深度,则必须编写自己的解析器。
但是如果你使用C#或perl,你可以使用“平衡组”来实现,这是一个高级的正则表达式功能,js不支持。:(