我正在寻找一个 SQL 语句,它将只返回我的表中其Name
字段包含特殊字符(不包括下划线)的行。
我试过了:
SELECT * FROM 'table' WHERE Name REGEXP '^[!#$%&()*+,\-./:;<=>?@[\\\]^`{|}~]+$'
但是没有骰子,这会返回一个空的结果集(尽管我专门添加了包含%, $, and #
字符的名称字段的行)。
第一个问题似乎是^
和$
符号(Mike C 总结得比我更快,为什么......)
但我也看到了转义问题:所有在正则表达式中表示某些东西的特殊字符都应该是逃脱特地放在了,[]
所以[
,,,,]
^
-
这是一个关于如何在 MySQL regexes 中转义字符组内的特殊字符的问题。
正则表达式文档中详述的结论:
方括号表达式是包含在 '[]' 中的字符列表。它通常匹配列表中的任何单个字符(但见下文)。
如果列表以 '^' 开头,则它匹配任何单个字符(但见下文),而不是来自列表的其余部分。
如果列表中的两个字符由'-' 分隔,这是整理序列中这两个(包括)之间所有字符范围的简写,例如ASCII 中的'[0-9]' 匹配任何十进制数字。
两个范围共享一个端点是非法的(!),例如“ace”。范围非常依赖于排序顺序,可移植程序应避免依赖它们。
要在列表中包含文字 ']',请将其设为第一个字符(在可能的 '^' 之后)。
要包含文字“-”,请将其设为第一个或最后一个字符,或范围的第二个端点。
要将文字“-”用作范围的第一个端点,请将其括在“[.”中 和 '.]' 使其成为整理元素(见下文)。
除了这些和一些使用 '[' 的组合(参见下一段)之外,所有其他特殊字符,包括 '\',在括号表达式中都失去了它们的特殊意义。
编辑
这是一个关于角色的一些有趣正则表达式的 SQL 小提琴]
DDL: 创建表 txt ( txt varchar(200) );
insert into txt values ('ab[]cde');
insert into txt values ('ab[cde');
insert into txt values ('ab]cde');
insert into txt values ('ab[]]]]cde');
insert into txt values ('ab[[[[]cde');
insert into txt values ('ab\\]]]]cde');
insert into txt values ('ab[wut?wut?]cde');
查询:
匹配一组[
和]
字符的天真方法。语法上没问题,但组是单个[
字符,然后匹配多个]
字符。
SELECT * FROM txt WHERE txt
REGEXP 'ab[[]]+cde';
转义 -> 相同 ???
SELECT * FROM txt WHERE txt
REGEXP 'ab[[\]]+cde';
双重转义 -> 不起作用,组现在是 a[
和 a\
SELECT * FROM txt WHERE txt
REGEXP 'ab[[\\]]+cde';
将右括号与组内的左括号交换。这是我写过的最奇怪的正则表达式 - 到目前为止......
SELECT * FROM txt WHERE txt
REGEXP 'ab[][]+cde';
我会在一个奇怪的噩梦中被这样一个(完全有效的!)正则表达式杀死,我认为:
SELECT * FROM txt WHERE txt
REGEXP 'ab[]wut?[]+cde';
此正则表达式应匹配仅包含特殊字符的名称。您指定表示字符串开头的克拉 (^)、带有特殊字符列表的字符类、表示一个或多个的加号 (+),然后指定表示字符串结尾的美元。您需要考虑字符串中的非特殊字符。你可以尝试这样的事情:
WHERE Name REGEXP '^.*?[!#$%&()*+,\-./:;<=>?@[\\\]^`{|}~]+.*?$'
我添加了 .*? 在开始和结束时允许在特殊字符之前和之后使用非特殊字符。顺便说一句,您可能不再需要 (+) 了,因为一场比赛就足够了。