2017-04-26 59 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)\})(.*?)\} 
相關問題