为什么我的正则表达式会选择一切?

时间:2009-07-29 08:03:51

标签: regex

嘿伙计们,我正在尝试从文本中选择一个特定的字符串,但我不是正则表达式的主人。 我试过一种方式,它从我想要的字符串开始,但它也匹配我想要的东西。

我的正则表达式:

\nSCR((?s).*)(GI|SI)(.*?)\n

我正在匹配的文字。

Hierbij een test

SCR
S09
/vince@test.be
05FEB
GI BRGDS OPS

middle text string (may not selected)

SCR
S09
05FEB
LHR
NPVT700 PVT701 30MAR30MAR 1000000 005CRJ FAB1900 07301NCE DD
/ RE.GBFLY/
GI BRGDS

选择中间字符串,它只需要SCR直到GI线。

2 个答案:

答案 0 :(得分:2)

在第一个量词上使用非贪婪量词:

\nSCR((?s).*?)(GI|SI)(.*?)\n

或者您可以使用negative look-ahead assertion (?!expr)来捕获那些不以GISI开头的行:

\nSCR((?:\n(?!GI|SI).*)*)\n(?:GI|SI).*\n

答案 1 :(得分:1)

要从以SCR开头的行与以GISI(含)开头的行匹配,您可以使用以下正则表达式:

(?m:^SCR\n(?:^(?!GI|SI).*\n)*(?:GI|SI).*)

这将:

  • 找到一条线的起点。
  • 匹配SCR和新行。
  • 匹配所有不以GISI开头的行。
  • 匹配最后一行,要求有GISI(如果没有GISI,这会阻止它与字符串的结尾匹配