SQL匹配特殊字符正则表达式

时间:2013-01-30 13:04:37

标签: mysql sql database

我正在寻找一个只返回我的表格行的SQL语句,其中Name字段包含特殊字符(不包括下划线)。

我试过了:

SELECT * FROM 'table' WHERE Name REGEXP '^[!#$%&()*+,\-./:;<=>?@[\\\]^`{|}~]+$'

但是没有骰子,这会返回一个空结果集(尽管我专门添加了包含%, $, and #个字符的名称字段的行。)

2 个答案:

答案 0 :(得分:4)

第一个问题似乎是^$标志(Mike C总结得比我为什么要快......)

但是我也看到了逃避问题:regexp中所有特殊字符应该是转义特别放在[]中,所以[]^-

以下是关于how to escape special characters inside character groups in MySQL regexes的问题。

结论详见regex documentation

  

括号表达式是用“[]”括起来的字符列表。它通常匹配列表中的任何单个字符(但见下文)。

     
      
  • 如果列表以'^'开头,则它匹配任何单个字符(但请参阅      下面)不是从列表的其余部分。

  •   
  • 如果列表中的两个字符用“ - ”分隔,则这是整理顺序中这两个(包括)之间的全部字符的简写,例如:      ASCII中的“[0-9]”匹配任何十进制数字。

  •   
  • 两个范围共享端点是非法的(!),例如'高手'。范围依赖于序列依赖,并且可移植程序应该避免依赖它们。

  •   
  • 要在列表中包含文字']',请将其设为第一个字符(跟随可能的'^')。

  •   
  • 要包含文字“ - ”,请将其设置为范围的第一个orlast字符或第二个端点。

  •   
  • 要使用文字“ - ”作为范围的第一个端点,请将其括在'[。'中。和'。''使它成为一个整理元素(见下文)。

  •   
     

除了使用'['(参见下一段)的这些和一些组合外,所有其他特殊字符(包括'\')在其中失去了特殊意义   括号表达

修改 Here is an SQL fiddle关于]字符

的一些有趣的正则表达式

<强> 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';

Escaped - &gt;相同???

SELECT * FROM txt WHERE txt 
REGEXP 'ab[[\]]+cde';

双重逃避 - &gt;如果不起作用,则组现在为[\

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';

答案 1 :(得分:1)

此正则表达式应匹配仅包含特殊字符的名称。您指定表示字符串开头的克拉(^),带有特殊字符列表的字符类,用于表示一个或多个的加号(+),然后用美元表示字符串的结尾。您需要在字符串中考虑非特殊字符。你可以尝试这样的事情:

WHERE Name REGEXP '^.*?[!#$%&()*+,\-./:;<=>?@[\\\]^`{|}~]+.*?$'

我添加了。*?在开头和结尾允许特殊字符前后的非特殊字符。顺便说一下,你可能不再需要(+)了,因为一个特殊的就足够了。