记事本++的正则表达式:寻找其中可能包含换行符
问题描述:
给出一个包含有100000+日志消息像一个文件长字符串:记事本++的正则表达式:寻找其中可能包含换行符
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] connectorStatus: Pending
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] context: <DataItem type="System.Availability.StateData" time="2017-08-04T01:10:59.9525690+02:00"><ManagementGroupId>{05120214-5C27-A4EE-D32B-09CB2239421C}</ManagementGroupId><Property Name="Details" VariantType="8">There are 1 messages attached
03.08.2017 21:00:12
Title: Mail sync issue
User Impact: Users are unable to sync emails using Apple Mail on their Mac computers.
</Property></DataItem>
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] context_ManagementGroupId: {05120214-5C27-A4EE-D32B-09CB2239421C}
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] context: null
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] context_HealthServiceId: 390382B5-C177-0529-DDC0-F2969F667E49
每个日志消息上的时间戳开头的新行开始。但是一些日志消息延伸到多行;在上面的例子中看到包含第二行的“上下文”,然后与多个嵌入一些换行符任意XML。因此,在上例中恰好有5条日志消息。
我正在寻找这是非常长的,说超过15000个字的日志信息。
我可以通过使用记事本+ +搜索出该模式的所有相关日志消息步骤(选项“匹配换行符。”选择):
context:(.+?)2017-0\d-\d\dT\d\d:\d\d:\d\d:
但我未能延续,它会给我只有很长的。
我预计,以下可以工作,但没有运气(它选择整个文件):
context:(.+?){15000,}2017-0\d-\d\dT\d\d:\d\d:\d\d:
如果这是不可能的记事本+ +,我也愿意用其他工具,包括Linux机器上的命令行。
没有必要的,但如果很容易可行:
搜索相同的东西我已经解释和更换整个XML字符串的长度(字符数)。
答
您可以使用
(?s)context:(?:(?!2017-0\d-\d\dT\d\d:\d\d:\d\d:).){350,}
说明:
-
(?s)
- DOTALL模式ON(同.
匹配换行符启用) -
context:
- 文字串 -
(?:(?!2017-0\d-\d\dT\d\d:\d\d:\d\d:).){350,}
- 350次或更多次出现({350,}
)任何字符(.
)不启动2017-0\d-\d\dT\d\d:\d\d:\d\d:
子模式的序列组成。
(?:(?!).)*
是所谓的greedy tempered token。
根据您的看法调整限制量词最小阈值。 (?S)
尝试'方面:(:(?2017-0 \ D- \ d \的dT \ d \ d:\ d \ d:\ d \ d :)) {350}'和'调整到350'您门槛。 –
Wiktor的,你是一个天才:-)也许你能解释一下这是如何工作? – mez79
我添加了一个答案有一点的解释。 –