![](/img/trans.png)
[英]C# Use Regex to Remove everything inside brackets and the brackets themselves
[英]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.