多线,多变贪婪,正规表达

时间:2014-09-26 20:02:18

标签: regex pcre regex-greedy

鉴于以下文本,您将使用什么PCRE正则表达式来提取以粗体标记的部分?

00:20314 lorem ipsum
  want this
  kryptonite

00:02314 quux
  padding
  dont want this

00:03124 foo
     neither this

00:01324 foo
     but we want this
     stalagmite

00:02134 tralala
     not this

00:03124 bar foo
     and we want this
     kryptonite but not this(!)

00:02134 foo bar
     and not this either

00:01234 dolor sit amet
     EOF

我们想要提取以正则表达式开头的部分" ^ 0"并以"(kryptonite | stalagmite)"结束。

对此进行了一些咀嚼,发现它很难解决。 TIA!

4 个答案:

答案 0 :(得分:4)

执行此操作的一种方法是将Negative Lookahead与内联(?sm) dotall and multi-line modifiers结合使用。

(?sm)^0(?:(?!^0).)*?(?:kryptonite|stalagmite)

Live Demo

答案 1 :(得分:3)

这看起来很有效。

 # (?ms)^0(?:(?!(?:^0|kryptonite|stalagmite)).)*(kryptonite|stalagmite)

 (?ms)
 ^ 0
 (?:
      (?!
           (?: ^ 0 | kryptonite | stalagmite )
      )
      . 
 )*
 ( kryptonite | stalagmite )

答案 2 :(得分:2)

我相信这将是最有效的:

^0(?:\R(?!\R)|.)*?\b(?:kryptonite|stalagmite)\b

Demo


显然,我们从^0开始,然后以kryptonitestalagmite结束(在非捕获组中,对于它来说)\b word boundaries包围。

(?:\R(?!\R)|.)*?是有趣的部分,所以让我们分解它。一个关键概念首先是PCRE的\R newline sequence

(?:      (?# start non-capturing group for repetition)
  \R     (?# match a newline character)
  (?!\R) (?# not followed by another newline)
 |       (?# OR)
  .      (?# match any character, except newline)
)*?      (?# lazily repeat this group)

答案 3 :(得分:-1)

带有s修饰符的

^(00:。*?(kryptonite | stalagmite))