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

时间:2017-04-26 09:49:34

标签: c# regex

我写了" \{(?:!USER.)(.*?)\}"正则表达式来识别以下格式。 '#' 代表任何字符

{!USER.####} 

匹配波纹管模式的正确正则表达式是什么?但这与{!USER.####}模式

不匹配
{{!USER.NAME}} , {{!USER.PHONE}, {!USER.NAME}}  

2 个答案:

答案 0 :(得分:1)

您要放弃{!USER.XXX}包含单个{}的所有匹配项。

一个简单的解决方案是将1 + {} s分成不同的组,然后检查其中任何一个的长度是否大于1.如果是,则可以抓取比赛,否则,丢弃它。

C# demo

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

({+)!USER\.(.*?)(}+)模式会将1 + {个字符捕获到第1组,匹配USER.,然后将尽可能少地捕获到第2组任何0 +字符,直到第一个{,其中所有出现的次数都将被捕获到第3组。.Where(x => x.Groups[1].Length > 1 || x.Groups[3].Length > 1)行将过滤掉您不需要的行。{/ p>

答案 1 :(得分:0)

如果您想匹配,但有一些您想忽略的例外情况? 然后你可以使用负向前瞻(?!
在下面的正则表达式中,NAME或PHONE一词不得在点后面。

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