首页 > 解决方案 > 正则表达式组表达式不捕获内容

问题描述

我正在尝试创建一个大型正则表达式,其中计划是捕获 6 个组。将用于解析一些具有以下格式的 Android 日志:

2020-03-10T14:09:13.3250000 VERB    CallingClass    17503   20870   Whatever content: this log line had (etc)

到目前为止,我创建的表达式如下:

    (\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{7})\t([A-Za-z]{4})\t(\w{+})\t(\d{5})\t(\d{5})\t(.*$)

在这种情况下,行是制表符分隔的,尽管我正在开发的应用程序将是动态的,但情况并非总是如此,所以我觉得正则表达式仍然是最好的选择,即使比执行拆分更重。

从我的过程中更详细地分解组:

  1. 匹配日期(我正在考虑将其更改为 ax 字符数)

    (\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{7})

  2. 匹配 4 个字符的块

    ([A-Z-Z]{4})

  3. 匹配任意数量的字符,直到下一个制表符

    (\w{+})

  4. 匹配 5 个数字的块 2 次

    \t(\d{5})

  5. 最后,匹配其他所有内容,直到行尾。\t(.*$)

如果我对以下内容使用简化的表达式,则可以:

    (\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{7})\t([A-Za-z]{4})\t(.*$)

这不包括 3 个组、单词和 2 个数字块。

知道这是为什么吗?

谢谢你。

标签: c#regexregex-group

解决方案


问题是\w{+}要匹配一个单词字符,后跟一个或多个 { 字符,然后是最后一个 } 字符。如果您想要一个或多个单词字符,则只需使用不带花括号的加号(用于指定特定数字或数字范围,但如果它们不符合该格式,则将匹配文字花括号)。

(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{7})\t([A-Za-z]{4})\t(\w+)\t(\d{5})\t(\d{5})\t(.*$)

我强烈建议使用https://regex101.com/进行解释,以查看您的表达是否与您想要用文字拼写的内容相匹配。但是,对于在 C# 中使用的测试,您应该使用其他东西,例如http://regexstorm.net/tester


推荐阅读