mysql - 提取存储在 MySQL 字段中的第三级文件夹结构

标签 mysql sql regex

我在 PHP 中使用以下正则表达式( https://regex101.com/r/Kt9sNj/1 )来获取目录第三级中的所有文件:

/^(\/[^\/]*){1,4}\/?$/m
那么如果我有以下数据:
/home/myuser/folder_example/first_file.txt
/home/myuser/folder_example/second_file.txt
/home/myuser/folder_example/third_file.txt
我得到:
first_file.txt
second_file.txt
third_file.txt
我尝试在包含 json 对象数组的 MySQL 查询中使用它。
我的查询是:
SELECT data->'$.files' AS File 
FROM table 
WHERE user = 'myuser';
我得到:
["/home/myuser/folder_example/first_file.txt","/home/myuser/folder_example/second_file.txt","/home/myuser/folder_example/third_file.txt"]
但是当我在我的 sql 查询中使用那个正则表达式时:
SELECT data->'$.files' AS File 
FROM table 
WHERE user = 'myuser'
AND data->'$.files' REGEXP '^(\/[^\/]*){1,4}\/?$';
我需要得到这个(该目录下的所有文件):
["first_file.txt","second_file.txt","third_file.txt"]
它不起作用。你知道为什么吗?

最佳答案

函数REGEXP如果模式匹配,则返回 1,并且将返回完整匹配,因为模式确实与示例字符串匹配。
your pattern您正在重复一个捕获组,它将捕获组 1 中迭代的最后一个值,但它仍然包含您不希望在输出中出现的前导正斜杠。
您可能会做的是匹配第一个 / ,然后使用量词 {3}/ 结尾的部分精确重复 3 次使用非捕获组。
然后捕获组 1 中的文件名,并使用 '$1' 引用该组在替换中使用 REGEXP_REPLACE

^/(?:[^/]*/){3}(\S+\.[^.\s]+)$
Regex demo | Mysql with replace demo

关于mysql - 提取存储在 MySQL 字段中的第三级文件夹结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65110366/

相关文章:

MySQL查询基于另一个查询的结果

sql - 有没有办法反转 ActiveRecord::Relation 查询?

mysql - SQL 语法错误/无法添加或更新子行

mysql - SQL 性能 UNION 与 OR

python - 如何获取日志字符串的最后一部分并将其解释为 json?

c# - 使用正则表达式模式提取键值对

mysql - 在 Laravel Query Builder 中使用 `AND`,语法错误(orOn)

php - 如何将行变成列?

php - MySql 事务仅在控制台中有效

java - 小数点前 6 位和小数点后 2 位的正则表达式