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

3
我需要一个正则表达式,可以用来检查字符串并在进行.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"

由于某些原因,我在第一个索引处有一个空字符串,并且第三个索引缺少“-”。 我猜测这是因为它不是一个“单词”的一部分。

暂时忽略“-”,我想将“5level”拆分成一个数组:

"5"
"level"

我尝试了这个:
Regex exp2 = new Regex(@"(\d+)([a-zA-Z]+)");
string[] s2 = exp2.Split("5level");

但是,它返回了两个带有空字符串的索引,除了我想要的分割项之外,如下所示:
""
"5"
"level"
""

我对如何格式化表达式以获得所需结果感到困惑。任何帮助都将不胜感激。

1
你学会如何正确使用Markdown是很有礼貌的,这样别人就不必重新格式化你的帖子了。请看以下链接:http://stackoverflow.com/editing-help - spender
2
谢谢您的建议。这是我第一次发布,我会记住这些建议以备将来之需。 - Scott
2个回答

4

使用Regex.Split可能不如直接匹配所需的标记更容易:

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

Split函数可能会添加空匹配项,就像您所见到的那样,这些匹配项需要被过滤掉。


顺便说一下 - 对\W+进行分割几乎是与匹配\w+相反的模式。哦,而且在这种情况下,正则表达式没有%符号也基本相同 - 根据未指定的输入格式,您可能需要它。 - Kobi
非常感谢。这正是我在寻找的。我研究了你的表达式以理解它的逻辑。感谢您关于使用MatchCollection的建议。我甚至不知道有这种集合类型。 - Scott

0
更好的方法是使用RegEx引擎中的命名捕获组,并在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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接