[英]Capture groups in mysql regexp
我有一个表,其中包含一个表示路径的 varchar 列。 我想搜索具有遵循name.name[*]
类的模式的路径的行,其中 name 可以是任何东西。 我正在寻找路径列中任何位置包含的重复字符串,这些字符串由句点分隔,并且后面有一个方括号。
这似乎需要正则表达式,所以通过 python 我有类似https://regex101.com/r/apS20a/4
但是,尝试使用 MySQL 正则表达式来实现这一点是行不通的。 我已经能够将速记翻译成 REGEXP '([A-Za-z_]+).(\1[[0-9]+])',但似乎 MySql 正则表达式不支持捕获组。 有没有办法完成我想用 mysql 正则表达式做的事情? 谢谢
我不认为 MySQL 支持捕获组。 但是,如果您在第一个 .name[ 之间的字符串中只有一个示例.name[
.
第一个[
,您可以绕过它。 这不是一个通用的解决方案,只是在这种情况下的一种特定方法。
您可以通过以下方式获取名称:
select substring_index(substring_index(url, '[', 1), '.', -1) as name
然后将其合并到正则表达式中:
select t.*
from (select t.*,
substring_index(substring_index(url, '[', 1), '.', -1) as name
from t
) t
where url like concat('%', name, '.', name, '[%');
这只是使用like
而不是regexp
,因为[
和.
是正则表达式通配符。 当然,这假设 name 没有_
或%
。
编辑:
这是一种实际识别何时发生这种情况的方法——即使有多种模式也能正常工作。
这个想法是根据.
和[
- 然后应用它。 令人愉快的自我参照:
select t.*,
(url regexp regex)
from (select t.*,
substr(regexp_replace(url, '[^.]*[.]([^\\[]*)\\[[^.]*', '|$1[.]$1\\\\['), 2) as regex
from (select 'abcde.de[12345.345[ABC' as url union all
select 'abcdefdef[[[[..123.124['
) t
) t;
这是 db<>fiddle 中的上述内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.