鉴于以下文本,您将使用什么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!
答案 0 :(得分:4)
执行此操作的一种方法是将Negative Lookahead与内联(?sm)
dotall and multi-line modifiers结合使用。
(?sm)^0(?:(?!^0).)*?(?:kryptonite|stalagmite)
答案 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
显然,我们从^0
开始,然后以kryptonite
或stalagmite
结束(在非捕获组中,对于它来说)\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)
^(00:。*?(kryptonite | stalagmite))