.net – 正则表达式 – 重复组
发布时间:2020-12-14 06:24:09 所属栏目:百科 来源:网络整理
导读:我正在尝试读取日志文件并使用正则表达式提取一些机器/设置信息.以下是日志中的示例: ...COMPUTER INFO: Computer Name: TESTCMP02 Windows User Name: testUser99 Time Since Last Reboot: 405 Minutes Processor: (2 processors) Intel(R) Xeon(R) CPU 51
我正在尝试读取日志文件并使用正则表达式提取一些机器/设置信息.以下是日志中的示例:
... COMPUTER INFO: Computer Name: TESTCMP02 Windows User Name: testUser99 Time Since Last Reboot: 405 Minutes Processor: (2 processors) Intel(R) Xeon(R) CPU 5160 @ 3.00GHz OS Version: 5.1 .number 2600:Service Pack 2 Memory: RAM: 48% used,3069.6 MB total,1567.3 MB free ServerTimeOffSet: -146 Seconds Use Local Time for Log: True INITIAL SETTINGS: Command Line: /SKIPUPDATES Remote Online: True INI File: c:demoappsystemDEMOAPP.INI DatabaseName: testdb SQL Server: 10.254.58.1 SQL UserName: SQLUser ODBC Source: TestODBC Dynamic ODBC (not defined): True ... 我想捕获每个“块”数据,使用标题作为一个组,数据作为第二个(即“计算机信息”,“计算机名称:…….”)并重复每个块.到目前为止的表达是 (?s)(p{Lu}{1,} p{Lu}{1,}:rn)(.*rnrn) 这样可以将块块拉出来,就像它应该的那样,这很棒.但是我需要让它重复捕捉,我似乎无法获得.我尝试了几种分组表达式,包括: (?s)(?:(p{Lu}{1,}:rn)(.*rnrn))* 这似乎是正确的,但我得到了许多空组项值的NULL结果组.我正在使用.Net RegEx类来应用表达式,任何人都可以帮助我吗?
重复的团体是不可能的.该组将包含最后一场比赛.
你需要把它分成两个问题.首先,找到每个部分: new Regex(@"(?>^[A-Zs]+:s*$)s*(?:(?!^S).)*",RegexOptions.Singleline | RegexOptions.Multiline); 然后,在每个匹配中,使用另一个正则表达式将每个字段/值与组匹配: new Regex(@"^s+(?<name>[^:]*):s*(?<value>.*)$",RegexOptions.Multiline); 使用它的代码看起来像这样: Regex sectionRegex = new Regex(@"(?>^[A-Zs]+:s*$)s*(?:(?!^S).)*",RegexOptions.Singleline | RegexOptions.Multiline); Regex nameValueRegex = new Regex(@"^s+(?<name>[^:]*):s*(?<value>.*)$",RegexOptions.Multiline); MatchCollection sections = sectionRegex.Matches(logData); foreach (Match section in sections) { MatchCollection nameValues = nameValueRegex.Matches(section.ToString()); foreach (Match nameValue in nameValues) { string name = nameValue.Groups["name"].Value; string value = nameValue.Groups["value"].Value; // OK,do something here. } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |