在.NET中使用正则表达式拆分字符串

时间:2011-06-01 19:48:45

标签: c# .net regex

我需要一个正则表达式,当我在.NET中执行RegEx.Split()时,我可以使用它来检查字符串并返回特定项。我一直在努力做到这一点,但我似乎永远无法得到我需要的东西,结果永远都没有任何意义。显然我没有很好地处理正则表达式。

所以这是字符串......

"%date - %-5level - [%thread] - %logger - %message - %exception%newline"

我基本上希望返回一个如下所示的数组:

"date"
"-5level"
"thread"
"logger"
"message"
"exception"
"newline"

以下代码很接近,但不完全。

Regex exp = new Regex(@"\W+");
string[] s = exp.Split(@"%date - %-5level - [%thread] - %logger - %message - %exception%newline");

我得到以下内容:

""
"date"
"5level"
"thread"
"logger"
"message"
"exception"
"newline"

出于某种原因,我有一个空字符串作为第一个索引,第三个索引缺少“ - ”。我假设因为它不是“单词”的一部分。

暂时说“ - ”,我想把“5级”分成一个数组:

"5"
"level"

我试验了这个:

Regex exp2 = new Regex(@"(\d+)([a-zA-Z]+)");
string[] s2 = exp2.Split("5level");

但是,除了我想要的拆分项之外,它还返回2个带空字符串的索引:

""
"5"
"level"
""

我很难理解如何格式化表达式以给我我需要的东西。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

不是使用Regex.Split,而是匹配您需要的令牌可能更容易:

MatchCollection matches = Regex.Matches(s, @"%([\w\-]+)");
string[] words = matches.Cast<Match>().Select(m => m.Groups[1].Value).ToArray();

拆分可能会添加空的匹配,如您所见,必须将其过滤掉。

答案 1 :(得分:0)

一种更好的方法是使用RegEx引擎中的Named Capturing Groups并过滤出Linq查询中的所有空匹配项。

MatchCollection matches = Regex.Matches(s, @"%(?<SomeName>[\w\-]+)");
string[] words = matches.Cast<Match>().Where(m => m.Length > 0 ).Select(m => m.Groups["SomeName"].Value).ToArray();