【问题标题】:RegEx match anything except linebreaks up to positive lookaheadRegEx 匹配除换行符之外的任何内容,直到正前瞻
【发布时间】:2019-10-23 16:17:53
【问题描述】:

我正在尝试将某些文本行匹配到 RegEx (PCRE) 中的特定字符串。这是一个例子:

000000
999999900

20.10.19

Amoxicillin 1000 Heumann 20 Filmtbl. N2 - PZN: 04472730

-

Dr. Max Mustermann

在本文中,我想完全匹配这部分:

Amoxicillin 1000 Heumann 20 Filmtbl. N2

相似之处始终是 PZN 的部分和我想匹配的每一行末尾的 7-8 位数字。但是,PZN 部分有时可能位于下一行,而不是直接位于其后面:

000000
999999900

20.10.19

Amoxicillin 1000 Heumann 20 Filmtbl. N2
 - PZN: 04472730

-

Dr. Max Mustermann

所以它要么直接在它后面,要么在下一行。我已经尝试使用这个 RegEx 来做到这一点:

.*(?=[ \-\r\n]+PZN)

这确实有效,但是,在上面的第一个示例中,它与此匹配:

Amoxicillin 1000 Heumann 20 Filmtbl. N2 -

注意末尾的“-”。这不应该包含在比赛中。我想 RegEx 优先考虑 .* 部分,因为它是从左到右工作的,因此只删除了前瞻的最后一个字符。不过,我不知道该怎么做。

有什么想法吗?

【问题讨论】:

标签: regex regex-lookarounds


【解决方案1】:

一种选择是使用捕获组并在 - PZN: 部分之前匹配 0+ 个空白字符。

^(?![^\S\r\n]*$)(.+)\s* - PZN: \d{7,8}$
  • ^行首
  • (?![^\S\r\n]*$)断言不是空行
  • (.+)\s* 在第 1 组中捕获匹配任何字符 1+ 次后跟 0+ 次空白字符
  • - PZN: 匹配空格 - 和空格,然后是 PZN: 和空格
  • \d{7,8} 匹配 7-8 位数字
  • $行尾

Regex demo

另一个选项是使用前瞻形式的相同模式

^(?![^\S\r\n]*$).+(?=\s* - PZN: \d{7,8}$)

Regex demo

【讨论】:

    【解决方案2】:

    这可行:

    ^(.+?)(?=\s?- PZN:)
    
    • ^(.+?) - 在一行的开头懒惰地匹配所有内容
    • (?=\s?- PZN:) - 一旦我们检测到即将到来的 PZN:,就告诉 .+? 退出匹配

    https://regex101.com/r/dhpth0/1/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多