首页 > 解决方案 > RegEx 匹配除换行符之外的任何内容,直到正前瞻

问题描述

我正在尝试将某些文本行匹配到 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 会优先考虑该.*部分,因为它是从左到右工作的,因此只会删除前瞻的最后一个字符。不过,我不知道该怎么做。

有任何想法吗?

标签: regexregex-lookarounds

解决方案


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

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

正则表达式演示

另一种选择是使用前瞻形式的相同模式

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

正则表达式演示


推荐阅读