正则表达式不适用于单/双引号

时间:2019-05-09 06:08:58

标签: mysql regex database mysql-workbench

我有一个名为myfield的字段,其中包含以下字符串:

{'Content-Language': 'en', 'X-Frame-Options': 'SAMEORIGIN', 'X-Generator': 'Drupal 7 (http://drupal.org)', 'Link': '<https://01.org/node>; rel="shortlink"', 'Some-Header-Key': 'max-age=31; addSomething', 'Content-Encoding': 'gzip'}

我要捕获'Some-Header-Key': 'max-age=31; addSomething',其中: 1)'Some-Header-Key'max-age是应该始终存在的固定值。

2)addSomething是可选的。

3)双冒号和等号之间可能存在一个或多个空格

4)通用形式为'key':'value',用单引号或双引号引起来。

5)([^""|'])*说:零个或多个不是单引号或双引号的字符。捕获addSomething

我写了这个查询:

select myfield
from mytable
where mycol regexp "('|"")Some-Header-Key('|"")\s*:\s*('|"")([^""|'])*max-age\s*=\s*[0-9]+([^""|'])*('|"")";

但是它不返回任何东西!尽管myfield包含上面的示例字符串。

当我将字段值复制到外部文本文件中并在grep中运行正则表达式时,正则表达式正确捕获了字符串。

MySQL有什么问题?我在Ubuntu 18.04中使用MySQL Workbench 8.0。

2 个答案:

答案 0 :(得分:2)

您的问题出在正则表达式中的\s上。 8之前的MySQL版本不支持该表示法,您需要使用字符类[:blank:]代替,即

where mycol regexp "('|"")Some-Header-Key('|"")[[:blank:]]*:[[:blank:]]*('|"")([^""|'])*max-age[[:blank:]]*=[[:blank:]]*[0-9]+([^""|'])*('|"")"

在MySQL 8中,您可以使用\s,但是您需要转义反斜线,因为MySQL在字符串中使用C样式的转义语法,因此\s仅转换为s。因此,将\s更改为\\s,它应该可以工作:

where mycol regexp "('|"")Some-Header-Key('|"")\\s*:\\s*('|"")([^""|'])*max-age\\s*=\\s*[0-9]+([^""|'])*('|"")"

Demo on dbfiddle

答案 1 :(得分:0)

不是单引号或双引号:[^'"]
零个或多个:[^'"]

单引号或两个双引号:('|"")
双引号或两个单引号:("|'')

任何一种引用类型:['"]('|")
单引号字符串:'[^']*'
带双引号的字符串:"[^"]*"
以上任一:('[^']*'|"[^"]*")

下一个问题:如何引用正则表达式字符串:如果它包含'",请使用反斜杠对其进行转义:

my_json REGEXP "('[^']*'|\"[^\"]*\")"

如果您使用对您“绑定”的东西,则不需要进行转义。 PHP具有mysqli_real_escape_stringadd_slashes

但是...我要使用JSON,您应该升级到MySQL 5.7或MariaDB 10.2,以便可以使用JSON函数代替REGEXP。