2017-04-26 97 views
1

我写过“\{(?:!USER.)(.*?)\}"正则表达式” “#”代表任意字符C#模式{!USER。####},{{!USER。####},{!USER。####}}的正则表达式

{!USER.####} 

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

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

需要输出什么?尝试['{+!USER \。(。*?)} +'](http://regexstorm.net/tester?p=%7b%2b!USER%5c.%28.*%3f%29%7d %2b是I =%7B%7B!USER.NAME%7D%7D +%2C +%7B%7B!USER.PHONE%7D%2C +%7B!USER.NAME%7D%7D +)。那么,[你的正则表达式](http://regexstorm.net/tester?p=%5c%7b%28%3f%3a!USER.%29%28.*%3f%29%5c%7d&i=%7b% 7b!USER.NAME%7d%7d +%2c +%7b%7b!USER.PHONE%7d%2c +%7b!USER.NAME%7d%7d +)已经可以捕获'NAME','PHONE'和'NAME',目前还不清楚你的模式有什么问题。 –

+2

你尝试过什么吗? – BugFinder

+0

@WiktorStribiżew我想改变模式来识别其他格式 –

回答

1

要放弃其中{!USER.XXX}包含单个{}所有比赛。

一个简单的办法是捕捉1+ { S和} 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+字符,尽可能少,直至第一{,其中有1次以上的事件将被捕获到组3中.行将过滤掉那些不需要的行。

+1

它的工作原理。谢谢解释 –

0

如果你想匹配,但也有一些例外你想忽略吗?
然后,您可以使用负面预览(?!
在下面的正则表达式中,单词NAME或PHONE不能位于点的后面。

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