-1

为澄清和具体而编辑

我知道这很难,但我想我还是会问...

我正在使用 grep 或 egrep "grep-E" (具有扩展的正则表达式功能)。我还被告知可以使用字符串并且可能有助于这项工作,但我还没有完全探索这个选项......

输入文件:是一个二进制文件,所以它包含各种垃圾

期望的输出:满足所有这些条件的字符串:

  1. 仅返回具有(8-24 个可读字符)的字符串,不包括空格“”,因为它们是输入文件中字符串的分隔符(分隔符)。

  2. 只有以下字符可以构成字符串,并且可以在字符串中的任何位置(开头、结尾、中间)出现:

“0-9”“az”“AZ”!# $ % ^ & ( ) @ ~ " ' ] ? [ * + ; , =

  1. 流中不允许使用以下字符:

/ \ . | : < >除了点 '.' 它只能在字符串的开头或结尾,但不能在中间。但是我已经从正则表达式中完全删除了它,b/c 我不知道指定它只能在流的末尾或开头的语法。如果我在点中包含点,它会返回大量“假字符串”“垃圾”

  1. 任何流都不应包含 3 个或更多重复的背靠背字符,即应忽略具有 3 个或更多重复 (back2back) 字符的字符串

即 aaab^s zY&$$$$[[[[[[777th, 或 ((((%% _ +++------ 应该被忽略。

  1. 所有不可读的字符都应该被忽略在流中是可以接受的。

即下标 ¹q n× ÷ ± Ð à ÿÿ Û è á » Ù ^ © ò 等...

我已经测试了你的一些建议,到目前为止,这个正则表达式完成了大约 90% 的工作。

(?!(.)\1{3})[0-9a-zA-Z!#$%^&()@~"'*-+][;,=]{8,24}

但仅当在 dubdubdubrubular.com 或 dubdubdub.gethifi.com/tools/regex 上进行测试时,由于某种原因,grep 正在阻塞它!!!

供您参考,我包含了相关二进制文件的示例:

样本:

http://pastebin.com/wY6a0Uir

注意:如果您在http://www.gethifi.com/tools/regex上测试示例,您会看到返回的第 21 行例如不应该被返回。

希望这能稍微澄清一下这个问题,而不是更混淆它:)

干杯!

4

2 回答 2

0

如果您的正则表达式引擎支持它,您可以使用带有反向引用的零宽度负前瞻断言。将此添加到您的正则表达式的开头:

(?!(.)\1{3})

所以完整的正则表达式看起来像这样:

(?!(.)\1{3})[0-9a-zA-Z!@#$%\^()+_{}]{6,24}

或这个:

(?!(.)\1{3})[!--/-\~]{6,24}

在以下位置进行测试:

http://rubular.com/r/RbYIXR4a16

于 2013-11-11T01:18:49.150 回答
0

我会说你最好的办法是拆分字符串[^[:cntrl:].\ ]\1{4,}
然后再次拆分每个元素[[:cntrl:].\ ]

否则,您将陷入永恒的后视/前瞻噩梦。

于 2013-11-11T01:34:46.630 回答