为什么MySQL REGEXP不过滤掉这些值?



所以我试图找到什么"特殊字符";已用于我的客户名称。我正在更新这个查询,以便逐一找到它们,但它仍然显示所有带有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 .&(),]"

我在最后删除了+,因为你真的不在乎有多少;这样,它会在找到一个后停止。

最新更新