我尝试运行此查询:
SELECT column FROM table WHERE column REGEXP '[^A-Za-z\-\']'
但是会返回
#1139 - 出现错误'无效字符范围'来自regexp
在我看来,字符类中的-
没有被转义,而是被读作无效范围。是否有其他方式可以将mysql转义为文字-
?
这个正则表达式在mysql https://regex101.com/r/wE8vY5/1之外的预期工作。
我提出了另一种正则表达式
SELECT column FROM table WHERE column NOT REGEXP '([:alpha:]|-|\')'
所以问题不在于如何让它发挥作用。问题是为什么第一个正则表达式不起作用?
这是问题的SQL小提琴,http://sqlfiddle.com/#!9/f8a006/1。
此外,这里没有使用语言,查询正在DB级别运行。
PHP中的正则表达式:http://sandbox.onlinephpfunctions.com/code/10f5fe2939bdbbbebcc986c171a97c0d63d06e55
JS中的正则表达式:https://jsfiddle.net/6ay4zmrb/
答案 0 :(得分:3)
只需更改订单。
SELECT column FROM table WHERE column REGEXP '[^-A-Za-z\']'
答案 1 :(得分:3)
@Avinash Raj是正确的-
必须是第一个(或最后一个)。 \
不是POSIX中的转义字符,这是mysql使用的https://dev.mysql.com/doc/refman/5.1/en/regexp.html。
一个关键的语法区别是反斜杠不是POSIX括号表达式中的元字符。
- http://www.regular-expressions.info/posixbrackets.html
What special characters must be escaped in regular expressions?
在字符类内部,反斜杠是POSIX正则表达式中的文字字符。你不能用它来逃避任何事情。你必须使用"聪明的位置"如果要将字符类元字符包含为文字。将^除了在开头处,在开头处,以及 - 在字符类的开头或结尾处 - 以匹配这些字面意义