正则表达式用于搜索嵌套级别

3
如何使用正则表达式搜索嵌套级别的搜索字符串
例如,我有如下字符串:
var str = "samir patel {samirpatel@test1.com{sam@somedomain.com}}";

输出结果应该是sam@somedomain.com。

2个回答

5
你可以简单地使用这个模式:
{([^{}]*)}

这将匹配任何不包含其他组(如{some content})的字符串,例如{some content}。您可以在此处测试:http://regexpal.com/
您可以使用以下代码进行捕获:
var str = "samir patel {samirpatel@test1.com{sam@somedomain.com}}";
var regex = new Regex("{([^{}]*)}");
var matches = regex.Matches(str);
var output = matches[0].Groups[1].Value;
// output == "sam@somedomain.com"

更简单的说:
var str = "samir patel {samirpatel@test1.com{sam@somedomain.com}}";
var output = Regex.Match(str, "{([^{}]*)}").Groups[1].Value; 
// output == "sam@somedomain.com"

这将输出类似于{sam@somedomain.com}的内容。感谢您达到了这个水平。但是如何去掉括号呢?我需要像sam@somedomain.com这样的输出。 - Nijesh
第一组是没有括号的内容。请查看我的更新答案。 - p.s.w.g
哇,这个可行。谢谢。标记为答案。请问您能再给一个提示吗?如果我使用的是<>括号而不是{}括号,应该用什么?例如:"samir patel <samirpatel@test1.comsam@somedomain.com>" - Nijesh
@Nijesh,您想要相同的模式还是不同的模式?换句话说,如果输入是“samir patel <samirpatel@test1.com{sam@somedomain.com}>”,输出应该是什么? - p.s.w.g
以同样的模式输出 "sam@somedomain.com"。例如,如果输入是 "samir patel <samirpatel@test1.comsam@somedomain.com>"输出应该是 sam@somedomain.com它应该从 <> 中找到最内部的字符串。 - Nijesh
@Nijesh 那么模式 [<{]([^<>{}]*)[>}] 应该可以工作,但有点奇怪。它将 < / {> / } 视为可互换的,因此例如如果输入是 a{b<c}>,输出将是 c。希望这对您的目的没有问题。 - p.s.w.g

1
你可以使用 (?<=\{)[^{}]*(?=\}) 来得到这个结果,假设你使用的是除 JavaScript 以外的语言。例如在 C# 中,就是这样:
result = Regex.Match(str, @"(?<=\{)[^{}]*(?=\})").Value;

如果您正在使用JavaScript,请使用\{([^{}]*)\}并访问$1以获取匹配结果:
var myregexp = /\{([^{}]*)\}/;
var match = myregexp.exec(subject);
if (match != null) {
    result = match[1];
}

我使用了以下代码,但输出为空值。var regex = new Regex(@"(?<={)[^{}]*(?=})"); var matches = regex.Matches(strFromEmail); - Nijesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接