如何解决在mysql正则表达式中捕获组
我有一个表,该表带有表示路径的varchar列。我想搜索具有遵循name.name[*]
之类的模式的路径的行,其中名称可以是任何东西。我正在寻找路径列中任何位置的重复字符串,这些字符串之间用句点分隔,并在其后加一个方括号。
这似乎需要Regexp,因此通过python,我得到了类似https://regex101.com/r/apS20a/4
的信息但是,尝试用MySQL Regexp来实现这一点是行不通的。我已经可以将简写转换为REGEXP'([[A-Za-z _] +)。(\ 1 [[0-9] +])'',但是MySql Regex似乎不支持捕获组。有没有一种方法可以完成我要使用mysql regexp进行的操作?谢谢
解决方法
我不认为MySQL支持捕获组。但是,如果在第一个.name[
和第一个.
之间的字符串中只有一个[
的示例,则可以绕开它。这不是一般的解决方案,在这种情况下只是一种特定的方法。
您可以通过以下方式获取名称:
select substring_index(substring_index(url,'[',1),'.',-1) as name
然后将其合并为正则表达式:
select t.*
from (select t.*,substring_index(substring_index(url,-1) as name
from t
) t
where url like concat('%',name,'[%');
这仅使用like
而不是regexp
,因为[
和.
是正则表达式通配符。当然,这假设名称没有_
或%
。
编辑:
这是一种实际上可以确定何时发生的方法,即使存在多种模式也可以使用。
这个想法是根据.
和[
之间发生的事情构造正则表达式,然后再应用它。自我推荐:
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;
Here是db 小提琴中的上述内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。