Regex 正则表达式匹配最外层的模式
我想知道与{}中的所有内容匹配的正则表达式。字符串可能包含嵌套的{};我不在乎他们 示例字符串:{不要}相信我。我是一个{非常非常{邪恶}的好人 我希望结果是不,非常非常非常{邪恶}Regex 正则表达式匹配最外层的模式,regex,Regex,我想知道与{}中的所有内容匹配的正则表达式。字符串可能包含嵌套的{};我不在乎他们 示例字符串:{不要}相信我。我是一个{非常非常{邪恶}的好人 我希望结果是不,非常非常非常{邪恶} 目前我仅有的正则表达式是/{\w+}/它只捕获邪恶。如果没有撇号,它也会返回not。因为有嵌套的大括号,所以提取大括号之间的部分的正则表达式不像:-\{.+?\}那样直。这个正则表达式将在它找到的第一个}处停止。因此,对于嵌套的大括号,它的行为将不好。为此,您需要一个稍微复杂一点的正则表达式。然而,我建议不要使用正
目前我仅有的正则表达式是/{\w+}/它只捕获邪恶。如果没有撇号,它也会返回not。因为有嵌套的大括号,所以提取大括号之间的部分的正则表达式不像:-\{.+?\}那样直。这个正则表达式将在它找到的第一个}处停止。因此,对于嵌套的大括号,它的行为将不好。为此,您需要一个稍微复杂一点的正则表达式。然而,我建议不要使用正则表达式来解决此类问题。正则表达式不够好,不能考虑匹配括号对。它们只能解析常规语言。对于更高级别的内容,您应该编写自己的解析器 也就是说,您可以尝试以下正则表达式:-
"/\{((?:[^{}]*\{[^{}]*\})*[^{}]*?)\}/"
第一组。这将考虑嵌套的括号,只要它们是平衡的。你没有把大括号作为实际字符串的一部分
除了上述解决方案之外,您还可以看看这个示例解析器,它适用于您的特定情况。事实上,这适用于任何形式的嵌套大括号,前提是您有平衡大括号:-
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);
因为您有嵌套的大括号,所以提取大括号之间的部分的正则表达式不像:-\{.+?\}那样直接。这个正则表达式将在它找到的第一个}处停止。因此,对于嵌套的大括号,它的行为将不好。为此,您需要一个稍微复杂一点的正则表达式。然而,我建议不要使用正则表达式来解决此类问题。正则表达式不够好,不能考虑匹配括号对。它们只能解析常规语言。对于更高级别的内容,您应该编写自己的解析器 也就是说,您可以尝试以下正则表达式:-
"/\{((?:[^{}]*\{[^{}]*\})*[^{}]*?)\}/"
第一组。这将考虑嵌套的括号,只要它们是平衡的。你没有把大括号作为实际字符串的一部分
除了上述解决方案之外,您还可以看看这个示例解析器,它适用于您的特定情况。事实上,这适用于任何形式的嵌套大括号,前提是您有平衡大括号:-
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);
@这是正确的
如果您使用js或java,并且不知道嵌套括号的深度,那么您必须编写自己的解析器
但如果您使用C或perl,您可以使用平衡组来实现这一点,这是一个高级正则表达式功能,js不支持 这是正确的
如果您使用js或java,并且不知道嵌套括号的深度,那么您必须编写自己的解析器
但如果您使用C或perl,您可以使用平衡组来实现这一点,这是一个高级正则表达式功能,js不支持 +1真的,我的朋友!我删除了我的答案,因为你的答案更准确。我的会在嵌套大括号中失败。+1真的,我的朋友!我删除了我的答案,因为你的答案更准确。我的将在嵌套大括号处失败。您使用的是哪个正则表达式引擎?有些支持递归,但大多数不支持。您使用的是哪个正则表达式引擎?有些支持递归,但大多数不支持。