-
Notifications
You must be signed in to change notification settings - Fork 53
关于简易通配符与jruby
knziha edited this page Jan 3, 2020
·
1 revision
简易通配符现在有两个:.和*。
点号用来跳过任意一个字符,星号用来跳过任意长度(0~n)的内容。
点号的机制是:在二进制串的当前位置解码一个字符,然后将之按照编码格式再编码,得到该字符的字节长度,最后跳过那个字节长度。星号则是跳过任意的字节长度。
如上,简易通配符的机制比较简单,就是跳过一些字节再进行字节查找。
不可避免地,会出现错匹问题。比如:
Charset _charset = Charset.forName("GB18030"); //编码是 GB18030
BU.printBytes("崭".getBytes(_charset)); // 0xd5,0xb8,
BU.printBytes("刚刚".getBytes(_charset)); // 0xb8,0xd5,0xb8,0xd5,
可见“刚刚”二字的中间两个字节正好是“崭”字的全部字节,那么在含有“刚刚”的文本中,以二进制级别查找“崭”字,就会发生一个错匹。
在词条搜索中,我用正则表达式检查来规避这个问题。即把查找到的二进制内容全部编码成字符串,把简易通配语句转换成正则表达式,再进行正则校验。
但是在全文搜索中,“二进制内容全部编码成字符串”似乎是个很耗时的操作,所以暂时没有加入校验的步骤。
问题重重