所以我试图找到什么"特殊字符";已用于我的客户名称。我正在更新这个查询,以便逐一找到它们,但它仍然显示所有带有a的客户——尽管我试图在查询中排除这个。
这是我正在使用的查询:
SELECT * FROM customer WHERE name REGEXP "[^da-zA-Z .&-(),]+";
该客户(以及许多其他带破折号的客户(仍显示在查询结果中:
Test-able Software Ltd
我错过了什么?基于该正则表达式,不应该将其从查询结果中排除吗?
在上测试https://regex101.com/r/AMOwaj/1显示没有对手。
编辑-因此,我想查找除正则表达式字符集中的字符之外的任何字符。不排除任何具有这些字符的。
您的代码检查字符串是否包含任何不属于字符类的字符,同时您希望确保没有任何字符属于它。
您可以使用^
和$
同时检查while字符串:
SELECT * FROM customer WHERE name REGEXP '^[^da-zA-Z .&-(),]+$';
这可能会用NOT
更简单地表达,并且不会否定字符类:
SELECT * FROM customer WHERE name NOT REGEXP '[da-zA-Z .&-(),]';
请注意,您不需要转义字符类中的所有字符,-
可能除外。
无论MySQL版本如何,都可以使用[0-9]
或[[:digit:]]
来匹配数字。
在不能成为范围结构的一部分的地方使用连字符。
将表达式固定为
SELECT * FROM customer WHERE name REGEXP "[^0-9a-zA-Z .&(),-]+";
如果整个文本应该与此模式匹配,请用^
/$
:括起来
SELECT * FROM customer WHERE name REGEXP "^[^0-9a-zA-Z .&(),-]+$";
-
表示一个范围,除非是第一个。(嗯,在"不是"(^
(之后。(
所以使用
"[^-0-9a-zA-Z .&(),]"
我在最后删除了+
,因为你真的不在乎有多少;这样,它会在找到一个后停止。