正则表达式前瞻问题

时间:2016-08-25 00:07:35

标签: regex search replace regex-lookarounds

我正在尝试使用包含前瞻的正则表达式,但我无法使其正常工作(正如我所料)。

我的结果似乎不一致,所以我怀疑这是我正在使用的程序的一个问题,但是我不能把它固定下来,而且我可能只是做错了。

我加载了一个包含十六进制图像的文件:

0000  ff ff 06 00 07 00 54 65 78 74 31 00 00 00 00 00  ÿÿ....Text1.....
0010  54 65 78 74 3f 00 00 00 00 54 65 78 74 33 01 10  Text?....Text3..
0020  44 3a 50 61 74 68 5c 46 69 6c 65 2e 65 78 74 00  D:Path\File.ext.

“文字”之前和之后的部分?是可变长度和可变内容,因此非标准的“混合”表示可能如下所示:

0000  ff ff 06 00 07 00  T  e  x  t  1 00 00 00 00 00 
0010  ... T  e  x  t  ? 00 ... 00 T  e  x  t  3 01 10
0020   D  :  P  a  t  h  \  F  i  l  e  .  e  x  t 00

我将光标定位在偏移0000处,我正在搜索(正则表达式):

(\xff\xff.{4}Text1\x00.{19,39}\x00)(?=Text3\x01.{1})
  or
\xff\xff.{4}Text1\x00.{19,39}\x00(?=Text3\x01.)

试图用这个替换它:

\x01\x02\x03\x04

我希望它最终会像这样(光标位于“Text3”中的“T”):

0000  01 02 03 04 54 65 78 74 33 01 10 44 3a 50 61 74  ....Text3..D:Pat
0010  68 5c 46 69 6c 65 2e 65 78 74 00                 h\File.ext.

大多数情况下,我得到“找不到图案”或类似的东西,但有时光标位置会发生变化(我认为通常会定位到“Text3”中的“T”),好像已经进行了替换,但之前没有任何内容“Text3”已更改,替换数据"\x01\x02\x03\x04"将被忽略。

我尝试过对搜索表达式的各种修改,如果我将前瞻更改为这样的普通捕获组,它似乎有效:

Search:  (\xff\xff.{4}Text1\x00.{19,39}\x00)(Text3\x01.)
Replace: \x01\x02\x03\x04$2

我最终得到了这个(光标位于“D:Path”中的“D”):

0000  01 02 03 04 54 65 78 74 33 01 10 44 3a 50 61 74  ....Text3..D:Pat
0010  68 5c 46 69 6c 65 2e 65 78 74 00                 h\File.ext.

但是,如果我试试这个:

Search:  (\xff\xff.{4}Text1\x00.{29}\x00)(?=Text3\x01.{1})
Replace: \x01\x02\x03\x04

我再次期待这一点(光标位于“Text3”中的“T”):

0000  01 02 03 04 54 65 78 74 33 01 10 44 3a 50 61 74  ....Text3..D:Pat
0010  68 5c 46 69 6c 65 2e 65 78 74 00                 h\File.ext.

但我最终得到了这个(光标位于“D:Path”中的“D”):

0000  01 02 03 04 44 3a 50 61 74 68 5c 46 69 6c 65 2e  ....D:Path\File.
0010  65 78 74 00                                      ext.

此外,如果我尝试相同的搜索,在替换结束时添加“$ 2”(由于第二组未捕获,这没有意义),如下所示:

Search:  (\xff\xff.{4}Text1\x00.{29}\x00)(?=Text3\x01.)
Replace: \x01\x02\x03\x04$2

我接近我原来想要的东西(除了光标位于“D:Path”中的“D”),但不是我期望的(我期待错误):

0000  01 02 03 04 54 65 78 74 33 01 10 44 3a 50 61 74  ....Text3..D:Pat
0010  68 5c 46 69 6c 65 2e 65 78 74 00                 h\File.ext.

因此,在可变长度表达式(超前)之外使用前瞻似乎有困难。并且,使用固定长度表达式后的前瞻,似乎将前瞻视为正常捕获组。

我没有提到程序的名称,因为我想首先了解我是否正确理解了事情并且我的期望是正确的,然后我想看看软件更新(不是免费的)是否会解决这个问题。

0 个答案:

没有答案