MySQL正则字符类为何需额外方括号?无外层语句生效原因
MySQL正则表达式中POSIX字符类的方括号问题
标准用法说明:MySQL里的POSIX字符类(比如
[:digit:]、[:alpha:]这类)必须放在外层方括号中才能生效为字符组,正确写法是[[:digit:]]{4},这表示匹配4个连续的数字字符,是遵循POSIX正则规范的标准用法,也是实际开发中应该使用的写法。无外层方括号的语句为何看起来能运行?
你写的SELECT prod_name FROM products WHERE prod_name REGEXP '[:digit:]{4}'并没有真正调用[:digit:]字符类,MySQL正则引擎会把它解析成字面量字符的集合:将:、d、i、g、t这些单个字符当成可匹配的范围,{4}表示这几个字符中的任意一个连续出现4次。你觉得它能正常匹配数字,大概率是巧合——比如测试数据里,符合“4个连续数字”的条目恰好没有出现“4个连续的:d/i/g/t”的情况,所以看起来结果符合预期,但实际上这个语句的逻辑和你想要的匹配数字的意图完全不一致。为何需要额外一层方括号?
POSIX字符类是命名式的字符集合,它本身不是单个字符,而是用来指代一类字符(比如[:digit:]指代0-9的数字)。只有用方括号把它包裹起来,正则引擎才会识别这是一个字符组,去匹配该类中的任意字符。如果不加外层方括号,引擎只会把它当成普通的字符序列处理,根本达不到匹配目标字符类的目的。
内容的提问来源于stack exchange,提问作者Zephyr_8
相关产品推荐
相关产品推荐

