我有一个名为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。
答案 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]+([^""|'])*('|"")"
答案 1 :(得分:0)
不是单引号或双引号:[^'"]
零个或多个:[^'"]
单引号或两个双引号:('|"")
双引号或两个单引号:("|'')
任何一种引用类型:['"]
或('|")
单引号字符串:'[^']*'
带双引号的字符串:"[^"]*"
以上任一:('[^']*'|"[^"]*")
下一个问题:如何引用正则表达式字符串:如果它包含'
或"
,请使用反斜杠对其进行转义:
my_json REGEXP "('[^']*'|\"[^\"]*\")"
如果您使用对您“绑定”的东西,则不需要进行转义。 PHP具有mysqli_real_escape_string
和add_slashes
。
但是...我要使用JSON,您应该升级到MySQL 5.7或MariaDB 10.2,以便可以使用JSON函数代替REGEXP。