C# 模式{!USER.{}的C正则表达式{!USER.{},{{!USER.{},{!USER.{!USER.{}

C# 模式{!USER.{}的C正则表达式{!USER.{},{{!USER.{},{!USER.{!USER.{},c#,regex,C#,Regex,我已经编写了“\{(?!USER.)(.*?\}”regex来识别以下格式“#”表示任何字符 {!USER.####} 什么是匹配以下模式的正确正则表达式?但这不应该与{!USER.#####}模式匹配 {{!USER.NAME}} , {{!USER.PHONE}, {!USER.NAME}} 如果您想匹配,但有一些例外情况需要忽略? 然后,您可以使用负前瞻(?!。 在下面的正则表达式中,单词NAME或PHONE不能位于圆点后面 \{!USER\.(?!(?:NAME|PHONE)\

我已经编写了“
\{(?!USER.)(.*?\}”
regex来识别以下格式“#”表示任何字符

{!USER.####} 
什么是匹配以下模式的正确正则表达式?但这不应该与
{!USER.#####}
模式匹配

{{!USER.NAME}} , {{!USER.PHONE}, {!USER.NAME}}  

如果您想匹配,但有一些例外情况需要忽略?
然后,您可以使用负前瞻
(?!

在下面的正则表达式中,单词NAME或PHONE不能位于圆点后面

\{!USER\.(?!(?:NAME|PHONE)\})(.*?)\}

如果
{!USER.XXX}
包含单个
{
}
,则要放弃所有匹配项

一个简单的解决方案是将1+
{
s和
}
s捕获到单独的组中,然后检查其中任何一个的长度是否大于1。如果大于1,您可以获取匹配项,否则,放弃它

:

var str=“{{!USER.NAME},{{!USER.PHONE},{!USER.NAME}{!USER.####}”;
var result=Regex.Matches(str,@“({+)!USER\(.*?(}+)”)
.Cast()
其中(x=>x.Groups[1]。长度>1 | | x.Groups[3]。长度>1)
.选择(m=>m.Value)
.ToList();

({+)!USER\.(.*)(}+)
模式将捕获1+
{
字符到组1,将匹配
用户。
,然后将捕获到组2中的任何0+字符,尽可能少,直到第一个
{
字符及其所有1+的出现,将捕获到组3中。
.Where(x=>x.Groups[1].Length>1 | | x.Groups[3]。Length>1)
line将过滤掉您不需要的内容。

所需的输出是什么?试试。嗯,已经捕获了
NAME
PHONE
NAME
,因此,不清楚您的模式出了什么问题。您尝试了什么吗?@WiktorStribiżew我想更改模式以识别其他格式also@InfoÁ西斯:一个nd这意味着什么?你到底需要得到什么?请发布你的完整相关代码,看看你的问题是什么。现在,你的文章中没有问题。为什么它对你有用?因为它匹配所有的大括号?或者因为
被转义,并且只匹配一个文本
?当我发布答案时,我解释OP方法的错误-我应该在这里解释什么?
var str = "{{!USER.NAME}} , {{!USER.PHONE}, {!USER.NAME}}  {!USER.####}";
var result = Regex.Matches(str, @"({+)!USER\.(.*?)(}+)")
        .Cast<Match>()
        .Where(x => x.Groups[1].Length > 1 || x.Groups[3].Length > 1)
        .Select(m => m.Value)
        .ToList();