c# - 正则表达式组表达式不捕获内容
问题描述
我正在尝试创建一个大型正则表达式,其中计划是捕获 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(.*$)
在这种情况下,行是制表符分隔的,尽管我正在开发的应用程序将是动态的,但情况并非总是如此,所以我觉得正则表达式仍然是最好的选择,即使比执行拆分更重。
从我的过程中更详细地分解组:
匹配日期(我正在考虑将其更改为 ax 字符数)
(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{7})
匹配 4 个字符的块
([A-Z-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/进行解释,以查看您的表达是否与您想要用文字拼写的内容相匹配。但是,对于在 C# 中使用的测试,您应该使用其他东西,例如http://regexstorm.net/tester
推荐阅读
- python - 如何为绘图添加标签?
- nanomsg - nanomsg (nng) 中的多个发布者和订阅者
- python-3.x - 在python中导入自己的文件
- android - 如何在列表视图项目中添加图像按钮?
- gulp - 使用 gulp-zip 压缩主目录并排除子目录
- knockout.js - 单击不使用 KnockoutJS
- javascript - Spring MVC:需要优雅的解决方案来处理传递到前端的字符串的转义和取消转义
- python - 在上传的 zipfile 中包含 Lambda 的 Python 依赖项或从 S3 存储桶下载?
- wordpress - 第一次点击wordpress链接不起作用
- sql - SQL COUNT DISTINCT 输出不正确