正则表达式对不捕获内容的表达式进行分组

Regex groups expression not capturing content

我正在尝试创建一个大型正则表达式,计划捕获 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. 匹配日期(我正在考虑将其更改为 x 个字符)

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

  2. 匹配 4 个字符的块

    ([A-Za-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 个数字块。

知道这是为什么吗?

谢谢。

问题是 \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/ for the explanation to see if your expression matches up with what you want spelled out in words. However for testing for use in C# you should use something else like http://regexstorm.net/tester