我有一个包含varchar列的表,该列表示一个路径。我想搜索路径遵循类似name.name[*]
这样的模式的行,其中名称可以是任何东西。我正在查找path列中任何位置包含的重复字符串,这些字符串由句点分隔,后面有一个方括号。
这似乎需要Regexp,所以通过python我得到了类似于https://regex101.com/r/apS20a/4的东西
然而,尝试用MySQL正则表达式来实现它是行不通的。我已经能够将速记翻译成REGEXP '(A-Za-z_+).(\1[0-9+])',但似乎MySql正则表达式不支持捕获组。有没有办法用mysql regexp来完成我想要做的事情?谢谢
发布于 2020-08-14 04:31:51
我不认为MySQL支持捕获组。但是,如果在第一个.
和第一个[
之间的字符串中只有一个.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
,因为[
和.
是正则表达式通配符。当然,这假设名称没有_
或%
。
编辑:
这里有一个方法,它可以实际识别这种情况发生的时间--即使有多种模式也能正常工作。
其思想是基于.
和[
之间发生的事情构造正则表达式--然后应用它。令人愉悦的自我参照:
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中,Here是上面的内容。
https://stackoverflow.com/questions/63402610
复制相似问题