【问题标题】:REGEX: Find block of text that starts with WORDX, ends with WORDZ, and does not contain WORDY正则表达式:查找以 WORD 开头、以 WORDS 结尾且不包含 WORDY 的文本块
【发布时间】:2017-05-03 15:06:04
【问题描述】:

我一直在尝试在 Notepad++ 上执行搜索,它找到了一个以某个字符串 (StringX) 开头并以另一个字符串 (StringZ) 结尾但不包含另一个字符串 (StringY) 的文本块。 为了给你一些背景信息,我正在查看一个包含数千个重复上述模式的块的文件,只有几个块没有它。

编辑 2: 具体例子已经上传到https://justpaste.it/1668j

正则表达式需要找到字符串 chargingContextSpecific .+?chargingContextSpecific((.|\r)+?),然后转到下一次迭代 3 个连续的右大括号 } \}\r.+?\}\r.+?\} 并在在这两个字符串之间,文本 JKLMN = 3GPP-Charging-Id 不存在。在示例中,Block#0 和 Block#2 是预期输出,Block#1 包含我正在寻找的模式。

请注意,我正在搜索的文件包含超过 200 万行,并且只有 6 或 7 种情况符合条件。

【问题讨论】:

  • 您可以添加 2 个示例的实际字符串,一个带 StringY,一个不带。以及您要提取什么。
  • 我认为(?s)StringX(?:(?!StringY|StringX).)*?StringZ 会起作用。
  • 我更新了示例

标签: regex notepad++


【解决方案1】:

根据您的示例:

[#0-9\s:]+chargingContextSpecific((?!JKLMN[\s=]*3GPP-Charging-Id).)*?(\s*:\s*\}\s*){3}

您需要在搜索框中勾选“匹配换行符”。这应该这样做。我已经尝试过了,它只返回了您提供的字符串中的 1 个匹配项。

【讨论】:

  • @JoseLuisGochiContreras - 尝试更新的正则表达式,虽然它有点慢。我只需要编写一个脚本来读取文档并循环遍历所有行。
  • 我认为我没有正确解释。我展示的示例不是我正在使用的实际文档的摘录(我无法添加实际文本,因为它包含客户机密数据),但我需要一个正则表达式来搜索每一行,直到找到 StringX .+StringX,之后它必须选择 StringX 之后的所有文本,直到找到三个连续的 '}' \}\r.+\}\r.+\} 的 StringZ 并且所有这一切都应该在每次 StringY 之间不存在时发生。任何字符的随机组合都可以出现在整个文本块中。
  • @JoseLuisGochiContreras - 您可以更改信息并在此处重新发布。我添加的正则表达式适用于您当前的示例。如果您需要更多帮助,您必须添加一个实际示例
  • 我将重新编辑示例并删除 cmets,以便只显示我需要过滤的实际文本,但是我仍然需要一个与我发布的确切文本不匹配的正则表达式,而是一般模式,例如而不是匹配 StringX 之前的确切空格数量,而是像 .+ 这样的表达式,它可以从行首捕获任何内容,直到找到 StringX,这是因为文档可以在文本块之间变化,唯一的常量是 StringX 、StringY 和三个连续的 '}' 字符 (StringZ)
  • @JoseLuisGochiContreras - 您在帖子中放置的示例含糊不清,这就是为什么您需要放置要提取的实际数据而不需要任何 cmets 或额外字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
相关资源
最近更新 更多