MySQL正则查询^[aeiou].*中.运算符作用及移除后结果异常原因
问题解答
正则中.运算符的作用
在MySQL支持的REGEXP正则语法中,.是通用单字符通配符,可以匹配除换行符之外的任意单个字符,不限制字符类型,字母、数字、特殊符号都能被它匹配。
你当前使用的正则^[aeiou].*各部分逻辑可以拆解为:
^:锚定字符串的起始位置,要求匹配校验必须从CITY字段值的第一个字符开始[aeiou]:字符集合,匹配a、e、i、o、u五个小写元音字母中的任意一个.:即上述提到的任意单字符匹配规则*:量词修饰符,代表它前面紧邻的匹配规则可以出现0次或任意多次
整段正则的实际筛选逻辑完全符合需求:CITY名称的第一个字符为元音字母,后续可以接任意内容(包括单字符元音、后面无其他内容的情况)。
移除.后查询结果错误的原因
如果把正则中的.删除,表达式会变为^[aeiou]*,此时匹配逻辑会完全偏离需求:
此时*直接修饰前面的[aeiou]字符集,规则变成「从字符串开头位置开始,匹配连续0个或多个元音字母」。
核心问题出在*的匹配规则允许0次匹配:哪怕CITY名称以辅音开头,只要在开头位置匹配到「0个元音字母」(即空内容),正则就会判定匹配成功。
举个实际例子:城市名
Dallas以辅音字母D开头,用修改后的^[aeiou]*匹配时,开头位置可以匹配到0个元音,会被错误判定为符合筛选条件,最终查询会返回表中所有城市数据,完全失去筛选作用。
内容的提问来源于stack exchange,提问作者shashikant solanki
相关产品推荐
相关产品推荐

