我有一个从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
我只是不知道如何在一个混合长度的字符串中一次只评估两个字符。并且,如果它们不适合表达式,则迭代到接下来的两个字符。但只有两个字符增量。
答案 0 :(得分:0)
我添加了一个Positieve Lookbehind。从字符串的开头开始,然后匹配2个字符。这可以确保您匹配的组始终具有2个字符的组。
Positieve Lookbehind:
(?<=^(..)*)
更新了正则表达式:
(?<=^(..)*)([2-7]{1}[A-Fa-f0-9]{1})
预览: Regex101