繁体   English   中英

在 mysql 正则表达式中捕获组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM