2012-07-30 47 views
0

下面的代碼在正則表達式與字符串匹配時起作用。如果其中一個角色不在那裏,例如MONEY-STAT丟失了?正則表達式缺失字符

string s = "MONEY-ID123456:MONEY-STAT43:MONEY-PAYetr-1232832938"; 
Regex regex = 
    new Regex(@"MONEY-ID(?<moneyId>.*?)\:MONEY-STAT(?<moneyStat>.*?)\:MONEY-PAYetr-(?<moneyPaetr>.*?)$"); 
Match match = regex.Match(s); 
if (match.Success) 
{ 
    Console.WriteLine("Money ID: " + match.Groups["moneyId"].Value); 


    Console.WriteLine("Money Stat: " + match.Groups["moneyStat"].Value); 
    Console.WriteLine("Money Paetr: " + match.Groups["moneyPaetr"].Value); 

} 

Console.WriteLine("hit <enter>"); 
Console.ReadLine(); 
+0

然後,它將不匹配並且不會'內執行的代碼,如果(match.Success) {...}' – Qiau 2012-07-30 10:24:20

+0

你爲什麼不自己嘗試? – 2012-07-30 10:24:21

+0

@Steve B不起作用,如果字符串不起作用。任何我可以改變正則表達式字符串? – Alvin 2012-07-30 10:26:22

回答

1

我改變MONEY-STAT(?:MONEY-STAT)?

MONEY-ID(?<moneyId>.*?)\:(?:MONEY-STAT)?(?<moneyStat>.*?)\:MONEY-PAYetr-(?<moneyPaetr>.*?)$ 

解釋:

(?: subexpression)  Defines a noncapturing group. 
?       Matches the previous element zero or one time. 
1

也許我誤解你的問題..但是,這合適嗎?

(MONEY-ID(?<moneyId>.*?)\:)?(MONEY-STAT(?<moneyStat>.*?)\:)?(MONEY-PAYetr-)?(?<moneyPaetr>.*?)$ 

它基本上使每個標記可選。它還包括冒號,因爲這顯然是某種分隔符。

免責聲明 我在正則表達式..可怕,但這個從我的測試在這裏工作:http://ideone.com/0pdFk

0

你可以試試這個:

(MONEY-ID[\d]+|(:?)MONEY-STAT[\d]+|:MONEY-PAYetr-[\d]+) 

這將匹配像下面的模式:

MONEY-ID123456:MONEY-STAT43:MONEY-PAYetr-1232832938

MONEY-STAT43:MONEY-PAYetr-1232832938

MONEY-ID123456:MONEY-PAYetr-1232832938