2009-07-29 24 views
0

嘿家伙,我试图从文本中选择一个特定的字符串,但我不是正则表达式的主人。 我尝试了一种方法,它从我想要的字符串开始,但它匹配我想要的所有内容。为什么我的正则表达式选择了一切?

我的正则表达式:

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

文字我匹配上。

Hierbij een test 

SCR 
S09 
/[email protected] 
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行。

+0

请不要将您的Regex代码引用为'he':P – Damien 2009-07-29 08:14:44

+3

是的,他们是她的:P – Kitson 2009-07-29 08:17:37

回答

1

要从线匹配SCR开始到符合GISI(含)起,您可以使用下面的正则表达式:

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

这将:

  • 找到一条线的开始。
  • 匹配SCR和一个新行。
  • 匹配的所有行不是以GISI开头。
  • 比赛中的最后一行,需要有要GISI(这防止它匹配到字符串的末尾,如果没有GISI
+0

我刚刚改变了我的正则表达式,Gumbo的启发。他的正则表达式考虑到如果一个组没有“GI”或“SI”行,则正则表达式不应匹配。现在我的正则表达式和他的第二个正则表达式非常相似,除了我使用行起始符'^'而不是匹配新行。 – Blixt 2009-07-29 08:41:19

2

使用非贪婪量词还对第一量词:

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

或者你可以使用一个negative look-ahead assertion (?!expr)捕捉只是那些不与任何GISI开始行:

\nSCR((?:\n(?!GI|SI).*)*)\n(?:GI|SI).*\n 
相关问题