当正则表达式与字符串匹配时,下面的代码可以正常工作。如果其中一个字符不存在,例如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 :(得分: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 :(得分:1)
也许我误解了你的问题..但这适合你吗?
(MONEY-ID(?<moneyId>.*?)\:)?(MONEY-STAT(?<moneyStat>.*?)\:)?(MONEY-PAYetr-)?(?<moneyPaetr>.*?)$
它基本上使每个标记都是可选的..它还包括冒号,因为它显然是某种分隔符。
<强>声明强> 我在正则表达式上很糟糕..但这在我的测试中起作用:http://ideone.com/0pdFk
答案 2 :(得分: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