2011-09-09 36 views
2

我想使用正则表达式来拆分日期&的日志文件的剩余部分 - 我认为很简单(非常好,因为我正则表达式中没有非常小)解析日志文件正则表达式

的第一道防线。 ..

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分十四秒”和“StringID”Custom_Task IDS_ENUM_Task_262144_0“找不到语言环境[]”

但我遇到了类似以下行的问题;

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

其余是的,我知道我可以只砍从特定字符排队,但有两个原因

  1. 正在读取的文件是巨大的&正则表达式是非常快比 左(子(右(长度 - 43等等:-)
  2. 可以确定日期的长度由用户实施的区域设置 确定 - 但是我知道在日期部分之前和之后将始终有两个 空间。
+0

正则表达式是什么味道/工具,你使用的? –

回答

2

你的问题是,splat操作符是“贪婪的”,即它匹配尽可能多的字符。你想让它变得“非贪婪”,所以它只能匹配少数字符。您可以通过将一个?*之后做到这一点,e.g

00000002 (.*?) (.*) 

我还拿了除去最主要的.*的自由,因为正则表达式默认为未锚定。

另一种解决方法是尝试匹配日期的格式,而不是使用(.*?),因此不再依赖双空格作为分隔符。

(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d)\s+(.*) 
0

事情是这样的:

\d+\s+\d+\s+([0-9-]+) 

00000002\s+([0-9-]+) 

看到它在行动在rubular

0
假设你所有的日期看起来像 YYYY-MM-DD HH:MM:SS你可以用下面这样做

所以,如果我得到这个权利,你想要的日期和之后它?

你用什么工具正则表达式?桑达? 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+一些空间

(.*)其余

它总是工作,但取决于你的数据真正的样子,我们可以做的更好......