正则表达式验证2个字符的十六进制字符串

时间:2018-02-14 21:48:44

标签: regex

我有一个从oracle数据库转换并加载到hadoop存储点的数据源。其中一列是BLOB,因此在可用代码集之外有许多控制字符和不可读/不可检测的ascii字符。我正在使用Impala编写正则表达式替换函数来解析正则表达式库无法理解的一些unicode字符。我想在使用unhex查询函数之前删除有问题的2个字符十六进制代码,以便我可以使用“干净”字符串进行其余的正则表达式解析。

这是我到目前为止使用的代码,但这并不常用:

'[2-7]{1}([A-Fa-f]|[0-9]{1})'

我已确定我只需要捕获\u0020-\u007f - 或用两位十六进制表示 20-7f

如果我的字符串看起来像这样:

010A000000153020405C00000000143020405CBC000000F53320405C4C010000E12F204058540100002D01

我希望能够一次捕获2个字符(例如01,0A,00)来评估它是否符合我上面提到的2 byte十六进制的可接受范围并仅返回什么是可以接受的。

正确的输出应该是:

30 20 40 5C 30 20 40 5C 33 20 40 5C 4C 2F 20 40 58 and 54

但是,我的表达式在我的第一个范围(5)中找到第一个可接受的数字,并从那里开始捕获,返回字符串的其余部分的位置或索引错误...这是我的表达式的返回 -

010A0000001**53**0**20****40****5C**000000001**43**0**20****40****5C**BC000000F**53****32**0**40****5C****4C**010000E1**2F****20****40****58****54**010000**2D**01

我只是不知道如何在一个混合长度的字符串中一次只评估两个字符。并且,如果它们不适合表达式,则迭代到接下来的两个字符。但只有两个字符增量。

我的例子:https://regex101.com/r/BZL7t0/1

1 个答案:

答案 0 :(得分:0)

我添加了一个Positieve Lookbehind。从字符串的开头开始,然后匹配2个字符。这可以确保您匹配的组始终具有2个字符的组。

Positieve Lookbehind:

(?<=^(..)*)

更新了正则表达式:

(?<=^(..)*)([2-7]{1}[A-Fa-f0-9]{1})

预览: Regex101