正则表达式对不捕获内容的表达式进行分组
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(.*$)
本例中的行是制表符分隔的,尽管我正在开发的应用程序将是动态的,但情况并非总是如此,所以我觉得正则表达式仍然是最好的选择,即使它比执行更重分裂。
从我的思考过程中更详细地分解组:
匹配日期(我正在考虑将其更改为 x 个字符)
(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{7})
匹配 4 个字符的块
([A-Za-z]{4})
匹配任意数量的字符直到下一个选项卡
(\w{+})
匹配一组 5 个数字 2 次
\t(\d{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
我正在尝试创建一个大型正则表达式,计划捕获 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(.*$)
本例中的行是制表符分隔的,尽管我正在开发的应用程序将是动态的,但情况并非总是如此,所以我觉得正则表达式仍然是最好的选择,即使它比执行更重分裂。
从我的思考过程中更详细地分解组:
匹配日期(我正在考虑将其更改为 x 个字符)
(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{7})
匹配 4 个字符的块
([A-Za-z]{4})
匹配任意数量的字符直到下一个选项卡
(\w{+})
匹配一组 5 个数字 2 次
\t(\d{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