C#正则表达式。大括号{}和mod(%)字符内的所有内容

时间:2016-02-24 22:24:03

标签: c# regex string

我试图在同一个正则表达式中获取{}和%%之间的值。 这就是我现在所拥有的。我可以为每个人成功获得价值,但我很想知道如何将两者结合起来。

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);
}

5 个答案:

答案 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;群组匹配,匹配%,否则匹配}

enter image description here

C# demo

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)

我认为你应该使用条件组和嵌套组的组合:

((\{(.*)\})|(%(.*)%))