MySQL REGEXP + 空格 (\s)
Posted
技术标签:
【中文标题】MySQL REGEXP + 空格 (\\s)【英文标题】:MySQL REGEXP + whitespace (\s)MySQL REGEXP + 空格 (\s) 【发布时间】:2013-03-11 14:11:25 【问题描述】:我使用的数据库以 LONGTEXT 数据类型存储 JSON 条目。我希望能够根据 JSON 数据选择条目。以下是一些示例数据:
"12f9cb0a-2218-4590-a05d-c1ffab00f693":
"0":
"value": "test"
,
"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":
"item":
"0": "11"
所以我想通过过滤掉空格来选择包含 "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9": "item": "0":"11" 的数据(制表符、空格、换行符)使用 REGEXP 函数,我试过这个没有用:
SELECT * FROM my_table WHERE (elements REGEXP BINARY '"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":\s*\s*"item":\s*\s*"0":\s*"11"\s*\s*');
正则表达式测试使用 Rubular 和 Regexpal.com 工作,但 mysql 似乎不喜欢 \s* 表达式。有没有人对此有更好的解决方案?
【问题讨论】:
【参考方案1】:在 MySQL 8.0 之前,MySQL 正则表达式仅支持 §12.7.2 "Regular Expressions" of the MySQL 5.7 Reference Manual 中列出的符号(或相应版本的对应符号),其中包括 [[:space:]]
符号,但不支持 \s
符号。因此,您只需将每次出现的\s
替换为[[:space:]]
。
在 MySQL 8.0 及更高版本中,MySQL 使用 Unicode [link] 国际组件的正则表达式支持,其中确实包括 \s
[link];但由于 MySQL 本身使用\
作为字符串中的转义字符,因此您需要将反斜杠加倍,将每次出现的\s
替换为\\s
。
【讨论】:
谢谢。是否有处理制表符、空格和换行符的 C 转义序列? (\s 的替代品) 重新阅读,查询仍然没有返回任何内容:(。它从 '"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":\\s*'... '"4d1dfd2e-7bc1 -4303-9c8c-90856e918bb9":\\s*' 不起作用 我用谷歌搜索了一下,发现您可以使用 转义大括号,但这仍然不起作用。 @TommyPlummer:'"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":[[:space:]]*\\'
工作得更好吗?
太棒了,它现在可以工作了!我将正则表达式字符串更改为 "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":[[:space:]]*[[:space:]]*"item": [[:space:]] *"0": "11"[[:space:]]*[[:space:]]* 成功拉表。大括号似乎不需要 \\ 转义字符(它似乎实际上破坏了查询)。再次感谢!【参考方案2】:
使用字符串替换;
select replace(json, ' ','') from table;
如果您的数据中有空格,这将不起作用。
【讨论】:
在您添加查询后,ruakh 发布了一个很好的答案。读他的。【参考方案3】:最好使用json类型:
SELECT CAST(`column` AS JSON)
WHERE JSON_EXTRACT(CAST(`column` as JSON),'$."4d1dfd2e-7bc1-4303-9c8c-90856e918bb9".item."0"')="11"
【讨论】:
以上是关于MySQL REGEXP + 空格 (\s)的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Oracle regexp_replace 从空格分隔列表中删除重复项? [复制]