我正在尝试使用正则表达式来分割日期&其余的日志文件 - 我认为非常简单(非常好,因为我没有很少的正则表达式)
第一行......
17 00000002 2011-05-02 22:39:14 StringID "Custom_Task IDS_ENUM_Task_262144_0" not found for locale []
可以正常使用
.*00000002 (.*) (.*)
(日期周围有两个空格) 这个组“2011-05-02 22:39:14”和“StringID”Custom_Task IDS_ENUM_Task_262144_0“找不到locale []”
但我遇到了类似以下行的问题;
17 00000002 2011-04-05 10:46:53 Warning: Server component Requirement.SSC failed to load. Please ensure that the server is properly licensed.
Please
之前的另外两个空格导致它将组1设为“2011-04-05 10:46:53警告:服务器组件Requirement.SSC无法加载。”显然,如果我尝试将其解析为失败的日期。
有什么建议吗?正如我所提到的,我真的不熟悉正则表达式,它可能正在盯着我: - )
我需要的是作为组1的日期时间和作为组2的行的其余部分
是的,我知道我可以从特定字符中删除该行,但这有两个原因
答案 0 :(得分:2)
你的问题是splat运算符是“贪婪的”,即它匹配尽可能多的字符。你想让它“非贪婪”,所以它匹配的字符很少。您可以在?
之后添加*
,例如
00000002 (.*?) (.*)
我也冒昧地删除了前导.*
,因为正则表达式默认为未锚定。
另一种解决方案是尝试匹配日期的格式而不是使用(.*?)
,因此您不再依赖双空格作为分隔符。假设您的所有日期都显示为YYYY-MM-DD HH:MM:SS
,您可以使用以下内容执行此操作:
(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d)\s+(.*)
答案 1 :(得分:0)
答案 2 :(得分:0)
所以,如果我做对了,你想要日期和之后的内容吗?
你使用正则表达式的工具是什么?桑达? Perl的?
前两个字段总是相似吗?现在前两个字段之间似乎有更多空格?
17 00000002 2011-04-05 10:46:53 Warning: Server component Requirement.SSC failed to load. Please ensure that the server is properly licensed.
使用perl,您可以执行cat myfile | perl -pe 's/^(?:\S+\s+){2}(\S+\s\S+)\s+(.*)/$1 ## $2/'
其中:
(?:\S+\s+){2}
表示我想要2次\ S + \ s +,这是非空格字符后跟空格字符(?:表示不捕获)
(\S+\s\S+)
与您的日期匹配:非空格字符后跟一个空格,后跟更多非空格字符
\s+
一些空格
(.*)
其余的
它总会有效,但根据您的数据真实情况,我们可以做得更好......