繁体   English   中英

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

[英]C# regex. Everything inside curly brackets{} and mod(%) charaters

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

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

与你的正则表达式相似。 您可以使用命名捕获组

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

如果您想了解条件表达式的工作原理,下面是使用这种.NET正则表达式功能的解决方案:

(?:(?<p>%)|(?<b>{))(?<v>.*?)(?(p)%|})

请参阅正则表达式演示

下面是它的工作原理:

  • (?:(?<p>%)|(?<b>{)) - 匹配并捕获组“p”与% (百分比),或组“b”(大括号)与{
  • (?<v>.*?) - 匹配并捕获到组“v”(值)任何字符(甚至是换行符,因为我将使用RegexOptions.Singleline )零次或多次,但尽可能少(懒惰匹配) *?量词)
  • (?(p)%|}) - 条件表达式含义:如果“p”组匹配,则匹配% ,否则匹配}

在此输入图像描述

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

有时候捕获是在第1组中,有时它在第2组中,因为你有两对括号。

如果您这样做,原始代码将起作用:

Console.WriteLine(match.Groups[1].Value + match.Groups[2].Value);

因为一个组将是空字符串,另一个组将是您感兴趣的值。

@"[\{|%](.*?)[\}|%]"

这个想法是:

{ or %
anything
} or %

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM