C#正则表达式中的组

时间:2011-08-09 19:13:05

标签: c# regex

我正在使用以下测试程序来尝试找出这个正则表达式: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

我的意见 123stringA 456 stringB

我的模式: ([0-9] {3})(。*?)

该模式最终将成为约会对象,但为了这个问题,我会保持简单并使用我的简化输入。

我理解这种模式的方式是,“给我3个数字[0-9] {3},然后是任意数量的任意数字。*,直到它到达下一个匹配?

我想要/期望的测试是2场比赛,每组2组:
比赛1
第1组 - 123
第2组 - stringA
MATCH2
第1组 - 456
第2组 - stringB

出于某种原因,我提供的链接上的测试人员看到有第二组,但它是空白的。我以前用PHP做过这个,它似乎按照我的描述工作,但在C#中我看到了不同的结果。您可以提供的任何帮助将不胜感激。

我还应该注意,这可能会扩展多行......

  • 编辑*

这是实际输入: 2011-08-09 09:25:57,069 [9] Orchard.Environment.Extensions.ExtensionManager - 加载扩展时出错2011-08-09 09:25:57,493 [8] Orchard.Environment.Extensions.ExtensionManager

对于比赛1,我想得到: 2011-08-09 09:25:57和 ,069 [9] Orchard.Environment.Extensions.ExtensionManager - 加载扩展程序时出错

和比赛2: 2011-08-09 09:25:57和 ,493 [8] Orchard.Environment.Extensions.ExtensionManager

我正在尝试找到一种解析错误日志文件的好方法,该错误日志文件位于一个巨大的文本文件中,并保留错误发生的日期以及随之而来的详细信息

4 个答案:

答案 0 :(得分:2)

第一组匹配3位数,第二组匹配字符串的其余部分,因为模式中没有任何内容可以防止.*?与字符串的其余部分不匹配。

更正:第二组匹配一个空字符串,因为模式中没有任何内容可以防止.*?与空字符串不匹配。

答案 1 :(得分:1)

.*表示匹配任何零次或多次。 ?意思是找到最小次数,因此它选择零匹配作为最小值。

尝试使用此模式,([0-9]{3})([a-zA-Z]*)

答案 2 :(得分:0)

不确定该工具为何会提供此功能,但您可以切换到适用于.Net

的替代模式
([0-9]{3})([^0-9]*)

http://regexhero.net/tester/?id=155b8e2b-b851-46b9-8a84-b82f8d6963a1

<强>解释

在您之前的模式中,nongreedy版本匹配0个字符。

在新版本中,[^0-9]表示匹配范围0-9以外的任何字符(请注意否定^说明符)。

更新:鉴于实际输入字符串(在注释中),模式更改为(假设OP想要执行的操作:

,([0-9]{3})([^\n]*)

http://regexhero.net/tester/?id=155b8e2b-b851-46b9-8a84-b82f8d6963a1

答案 3 :(得分:0)

根据您的评论,这是您想要匹配的内容

  

2011-08-09 09:25:57,069 [9]   Orchard.Environment.Extensions.ExtensionManager - 加载错误   扩展2011-08-09 09:25:57,493 [8]   Orchard.Environment.Extensions.ExtensionManager - 加载错误   扩展

此表达式将匹配第一个捕获组中的日期和其余日期,直到下一个日期或直到第二个捕获组中字符串的结尾。

(\d{4}(?:-\d{2}){2})(.*?)(?=(?:\d{4}(?:-\d{2}){2}|$))

here on Regexr