我试图在同一个正则表达式中获取{}和%%之间的值。 这就是我现在所拥有的。我可以为每个人成功获得价值,但我很想知道如何将两者结合起来。
var regex = new Regex(@"%(.*?)%|\{([^}]*)\}");
String s = "This is a {test} %String%. %Stack% {Overflow}";
上述字符串的预期答案
test
String
Stack
Overflow
个人正则表达式
@"%(.*?)%" gives me String and Stack
@"\{([^}]*)\}" gives me test and Overflow
以下是我的代码。
var regex = new Regex(@"%(.*?)%|\{([^}]*)\}");
var matches = regex.Matches(s);
foreach (Match match in matches)
{
Console.WriteLine(match.Groups[1].Value);
}
答案 0 :(得分:3)
与你的正则表达式相似。您可以使用Named Capturing Groups
String s = "This is a {test} %String%. %Stack% {Overflow}";
var list = Regex.Matches(s, @"\{(?<name>.+?)\}|%(?<name>.+?)%")
.Cast<Match>()
.Select(m => m.Groups["name"].Value)
.ToList();
答案 1 :(得分:2)
如果您想了解条件表达式的工作原理,下面是使用这种.NET正则表达式功能的解决方案:
(?:(?<p>%)|(?<b>{))(?<v>.*?)(?(p)%|})
请参阅regex demo
以下是它的工作原理:
(?:(?<p>%)|(?<b>{))
- 匹配并捕获Group&#34; p&#34; %
(百分比),或&#34; b&#34; (括号){
(?<v>.*?)
- 匹配并捕获到群组&#34; v&#34; (值)任何字符(即使是换行符,因为我将使用RegexOptions.Singleline
)零次或多次,但尽可能少(与*?
量词的懒惰匹配)(?(p)%|})
- 条件表达式含义:if&#34; p&#34;群组匹配,匹配%
,否则匹配}
。var s = "This is a {test} %String%. %Stack% {Overflow}";
var regex = "(?:(?<p>%)|(?<b>{))(?<v>.*?)(?(p)%|})";
var matches = Regex.Matches(s, regex, RegexOptions.Singleline);
// var matches_list = Regex.Matches(s, regex, RegexOptions.Singleline)
// .Cast<Match>()
// .Select(p => p.Groups["v"].Value)
// .ToList();
// Or just a demo writeline
foreach (Match match in matches)
Console.WriteLine(match.Groups["v"].Value);
答案 2 :(得分:1)
有时候捕获是在第1组中,有时它在第2组中,因为你有两对括号。
如果您这样做,原始代码将起作用:
Console.WriteLine(match.Groups[1].Value + match.Groups[2].Value);
因为一个组将是空字符串而另一个组将是您感兴趣的值。
答案 3 :(得分:0)
@"[\{|%](.*?)[\}|%]"
这个想法是:
{ or %
anything
} or %
答案 4 :(得分:0)
我认为你应该使用条件组和嵌套组的组合:
((\{(.*)\})|(%(.*)%))