正则表达式 - 在两个不包含单词的单词之间获取字符串

rrr*_*rrr 6 regex search jmeter cpu-word

我一直在环顾四周,无法实现这一目标.我不是完全的菜鸟.

我需要通过(包括)不包含START的START和END来分隔文本.基本上我找不到一种方法来否定整个单词而不使用高级的东西.

示例字符串:

abcSTARTabcSTARTabcENDabc

预期结果:

STARTabcEND

不好:

STARTabcSTARTabcEND

我不能使用向后搜索的东西.我在这里测试我的正则表达式:www.regextester.com

谢谢你的建议.

ste*_*ema 10

试试这个

START(?!.*START).*?END
Run Code Online (Sandbox Code Playgroud)

看到它在网上的Regexr

(?!.*START)是一个负面的先行.它确保不跟随单词"START"

.*?是所有角色的非贪婪匹配,直到下一个"结束".它需要,因为负向前瞻只是向前看并且没有捕获任何东西(零长度断言)

更新:

我想了一下,上面的解决方案是匹配到第一个"结束".如果不想这样做(因为你要从内容中排除START),那就使用贪婪的版本

START(?!.*START).*END
Run Code Online (Sandbox Code Playgroud)

这将匹配到最后一个"结束".

  • 如果字符串中有多个`START ... END`对,则会失败.(或者更确切地说,它只会在字符串中找到最后一个`START ... END`对.) (2认同)
  • 为了澄清蒂姆的评论:如果“START”*任何*第二次出现,无论是*之前*还是*之后*“END”,您的正则表达式将不会匹配您期望的位置(例如“abcSTARTabcENDxyzSTART”将不匹配) (2认同)

Tim*_*ker 6

START(?:(?!START).)*END
Run Code Online (Sandbox Code Playgroud)

将适用于任意数量的START...END对。在 Python 中演示:

>>> import re
>>> a = "abcSTARTdefENDghiSTARTjlkENDopqSTARTrstSTARTuvwENDxyz"
>>> re.findall(r"START(?:(?!START).)*END", a)
['STARTdefEND', 'STARTjlkEND', 'STARTuvwEND']
Run Code Online (Sandbox Code Playgroud)

如果您只关心START和之间的内容END,请使用:

(?<=START)(?:(?!START).)*(?=END)
Run Code Online (Sandbox Code Playgroud)

在这里看到它:

>>> re.findall(r"(?<=START)(?:(?!START).)*(?=END)", a)
['def', 'jlk', 'uvw']
Run Code Online (Sandbox Code Playgroud)


tri*_*eee 4

真正行人的解决方案是START(([^S]|S*S[^ST]|ST[^A]|STA[^R]|STAR[^T])*(S(T(AR?)?)?)?)END。现代正则表达式风格有负面断言,可以更优雅地做到这一点,但我将您对“向后搜索”的评论解释为可能意味着您不能或不想使用此功能。

更新:为了完整起见,请注意上面的内容对于结束分隔符是贪婪的。要仅捕获尽可能短的字符串,请扩展否定以覆盖结束分隔符 -- START(([^ES]|E*E[^ENS]|EN[^DS]|S*S[^STE]|ST[^AE]|STA[^RE]|STAR[^TE])*(S(T(AR?)?)?|EN?)?)END。不过,在大多数文化中,这有可能超出酷刑阈值。

错误修复:此答案的先前版本有一个错误,因为它SSTART可能是匹配的一部分(第二个S将匹配[^T],等等)。我修复了这个问题,但通过添加Sin并在非可选之前[^ST]添加,以允许任意重复其他内容。S*SS