Regex 这个包含否定和前后修正的正则表达式可以改进吗?

Regex 这个包含否定和前后修正的正则表达式可以改进吗?,regex,vim,Regex,Vim,使用vim 7.4(以下完整版本)检查xxd转储,如: 00030cb0: 4845 5453 4948 4554 5349 4845 5453 4948 HETSIHETSIHETSIH 00030cc0: 4554 5349 4845 5453 4948 4554 5349 4845 ETSIHETSIHETSIHE 00030cd0: 5453 4948 4544 4d41 4554 4831 3030 3a20 TSIHEDMAETH100: 00030ce0: 5478 2062

使用vim 7.4(以下完整版本)检查xxd转储,如:

00030cb0: 4845 5453 4948 4554 5349 4845 5453 4948  HETSIHETSIHETSIH
00030cc0: 4554 5349 4845 5453 4948 4554 5349 4845  ETSIHETSIHETSIHE
00030cd0: 5453 4948 4544 4d41 4554 4831 3030 3a20  TSIHEDMAETH100:
00030ce0: 5478 2062 7566 6665 7220 616c 6c6f 6361  Tx buffer alloca
00030cf0: 7465 642c 2061 6464 7220 3d20 3030 3046  ted, addr = 000F
00030d00: 4236 4639 0d0a 5453 4948 4554 5349 4845  B6F9..TSIHETSIHE
00030d10: 5453 4948 4554 5349 4845 5453 4948 4554  TSIHETSIHETSIHET
00030d20: 5349 4845 5453 4948 4554 5349 4845 5453  SIHETSIHETSIHETS
我在寻找不匹配IHETS输出序列的行,上面是0x30cd0-0x30d00。我有一个成功的正则表达式

\%(  \%(\%(\%(\%(\%(I\)\?H\)\?E\)\?T\)\?S\)\?\%(IHETS\)\+\%(I\%(H\%(E\%(T\%(S\)\?\)\?\)\?\)\?\)\?\)\@<!$
不幸的是,将
\%(
替换为
\(
)会慢得多(vim help会对此发出警告)

Vim版本 这个怎么样

/\%(  \(.\)\@=\(IHETS\|HETSI\|ETSIH\|TSIHE\|SIHET\)\2\2\1\)\@18<!$
在前面(即删除所有与图案匹配的线条)。不需要向后看


而且

可以缩短到

\%[IHETS]

不幸的是,对于匹配给定序列的后缀,似乎没有等效的功能。

感谢
\@18上的提示,它在vim帮助中作为一个单独的项目而不是
\@[count]所以我错过了。删除所有不匹配的行是不可能的,因为xxd转储嵌入在一个更大的日志文件中。感谢
\%[IHETS]
上的提示,这正是我今天希望了解的!匹配后缀的一个等效功能我想你指的是前缀。:-)我会在几天后接受你的答案,如果没有更好的改进。有趣!添加
18
在速度上会有很大的不同。我没想到,第一个不匹配的可能性是行尾前18个字节。内存分配可能会更少。@studog
\%[IHETS]
匹配IHETS的前缀,即“,”i“,”IH“,”IHE“,”IHET“,”IHETS“。啊,的确如此。我是在看它在哪里使用,而不是它在内部做什么。
/\%(  \(.\)\@=\(IHETS\|HETSI\|ETSIH\|TSIHE\|SIHET\)\2\2\1\)\@18<!$
:g/  \(.\)\@=\(IHETS\|HETSI\|ETSIH\|TSIHE\|SIHET\)\2\2\1$/d
\%(I\%(H\%(E\%(T\%(S\)\?\)\?\)\?\)\?\)\?
\%[IHETS]