一个正则处理汉字的有关问题,请各位看看
一个正则处理汉字的问题,请各位看看
正则:
(?<keyword1>.*?)(飞)(?<keyword2>.*?)
用的是-lboost_regex
预期匹配到例如 “北京飞南京”这样的输入(gbk编码),并将北京和南京两个关键词找出来
大部分验证都是正确的,但是今天发现了个特列
输入“史上”,这个正则也能匹配中.....
最终找到原因是:
飞的gbk编码:B7C9
史CAB7上C9CF
我的理解是:正则表达式的处理是按字节处理的,因为是gbk编码,汉字都被拆成两个字节,
史的第二个字节和上的第一个字节
整好拼成了飞,所以就命中了该正则
求如何破,才能让“史上”不命中
ps:gbk编码方式不变
------解决方案--------------------
可以把.改成中文编码规则
(?<keyword1>(([\x80-\xff].)
------解决方案--------------------
[a-zA-Z])*?)(飞)(?<keyword2>(([\x80-\xff].)
------解决方案--------------------
[a-zA-Z])*?)
正则:
(?<keyword1>.*?)(飞)(?<keyword2>.*?)
用的是-lboost_regex
预期匹配到例如 “北京飞南京”这样的输入(gbk编码),并将北京和南京两个关键词找出来
大部分验证都是正确的,但是今天发现了个特列
输入“史上”,这个正则也能匹配中.....
最终找到原因是:
飞的gbk编码:B7C9
史CAB7上C9CF
我的理解是:正则表达式的处理是按字节处理的,因为是gbk编码,汉字都被拆成两个字节,
史的第二个字节和上的第一个字节
整好拼成了飞,所以就命中了该正则
求如何破,才能让“史上”不命中
ps:gbk编码方式不变
正则
regex
c++
------解决方案--------------------
可以把.改成中文编码规则
(?<keyword1>(([\x80-\xff].)
------解决方案--------------------
[a-zA-Z])*?)(飞)(?<keyword2>(([\x80-\xff].)
------解决方案--------------------
[a-zA-Z])*?)