【问题标题】:Notepad++ regular expression: Search for long strings which could contain newlinesNotepad++ 正则表达式:搜索可能包含换行符的长字符串
【发布时间】:2017-08-11 09:02:03
【问题描述】:

给定一个包含 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 个字符。

我可以使用 Notepad++ 单步执行所有相关的日志消息来搜索此模式(选择“.matches newline”选项):

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:


如果 Notepad++ 无法做到这一点,我也愿意使用其他工具,包括 linux 机器上的命令行。


没有必要,但如果容易的话:
搜索与我解释的相同的内容,并将整个 xml 字符串替换为其长度(字符数)。

【问题讨论】:

  • 尝试(?s)context:(?:(?!2017-0\d-\d\dT\d\d:\d\d:\d\d:).){350,} 并将350 调整到您的阈值。
  • Wiktor,你真是个天才 :-) 也许你能解释一下这是怎么回事?
  • 我添加了一个带有一点解释的答案。

标签: regex notepad++ newline multiline


【解决方案1】:

你可以使用

(?s)context:(?:(?!2017-0\d-\d\dT\d\d:\d\d:\d\d:).){350,}

说明

  • (?s) - 开启 DOTALL 模式(与 . 匹配启用换行符相同)
  • context: - 文字子串
  • (?:(?!2017-0\d-\d\dT\d\d:\d\d:\d\d:).){350,} - 不以 2017-0\d-\d\dT\d\d:\d\d:\d\d: 子模式开始序列的任何字符 (.) 出现 350 次或更多 ({350,})。

(?:(?!).)* 是所谓的greedy tempered token

根据需要调整限制量词的最小阈值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多