我会第一个承认我不是最好的正则表达作家。我正在尝试解析PowerShell中的日志文件。日志文件以日期时间戳开头,可以是多行。一个例子如下:
2017-01-10T17:52:24.224-05:00 DEBUG (0EC3-018C) < ThisIsAClassName> [blah] log lines are here
this is an addition to the previous line
So is this at 2017-01
2017-01-10T17:52:26.224-05:00 DEBUG (0EC3-018C) < ThisIsADiffClassName> [blah] log lines are here
我的正则表达式如下所示
Timestamp = "\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}"
Anything = "[.|\w]"
NegativeLookahead = "(?!(" + Timestamp + "))"
FullRegex = Timestamp + Anything + NegativeLookahead
这给了我确切的输入。为了按行时间戳分割行,我做错了什么?
答案 0 :(得分:1)
我理解你处理多行内容。在这种情况下,拆分而不是匹配要容易得多:
"(?m)^(?=" + Timestamp + ")"
或者,为了避免在开始时使用空元素,请在(?!\A)
之前或之后添加^
预测:
"(?m)(?!\A)^(?=" + Timestamp + ")"
请参阅regex demo
最后看起来像(?m)^(?=\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3})
,并且会匹配任何行首位置((?m)
多行修饰符会使^
匹配行的开头而不是整个字符串)之后是时间戳模式但时间戳文本不会被消耗(=赢得不是匹配值的一部分,因此将出现在拆分文本中)as它在(?=...)
正向前瞻构造中使用。