保留基于子字符串的字符串

问题描述 投票:0回答:1

我需要保持包含子字符串一部分的单词在线。例如:

select regexp_substr('libstdc++-devel-4.8.5-39.0.3.el7.x86_64, python-kitchen-1.1.1-5.el7.noarch, nfs-utils-1.3.0-0.65.0.1.el7.x86_64, git-1.8.3.1-20.el7.x86_64', 
       '(.+?)(devel|git|nfs).+?\,') st from dual;

此查询返回libstdc ++-devel-4.8.5-39.0.3.el7.x86_64,但我还需要git-1.8.3.1-20.el7.x86_64nfs-utils -1.3.0-0.65.0.1.el7.x86_64。请注意,每行有几十个单词(不仅是四个单词),因此我需要调整模式以扩展结果(例如添加grub,perl等)。谢谢。

sql regex oracle
1个回答
0
投票

您的正则表达式有几个问题;它将匹配(例如)python-kitchen-1.1.1-5.el7.noarch, nfs-utils-1.3.0-0.65.0.1.el7.x86_64,,因为它允许空格和逗号(在(.+?)中)。另外,它不会与git-1.8.3.1-20.el7.x86_64匹配,因为在匹配结束时需要逗号。您可以通过将(.+?)替换为[^ ]*并将\,替换为(,|$)来解决这些问题。然后,您可以使用从this question派生的解决方案(尽管以我的首选形式,请检查NOT NULL中的CONNECT BY)以获取所有结果:

SELECT REGEXP_SUBSTR(str, '[^ ]*(devel|git|nfs).+?(,|$)', 1, level) AS lib
FROM (
  SELECT 'libstdc++-devel-4.8.5-39.0.3.el7.x86_64, python-kitchen-1.1.1-5.el7.noarch, nfs-utils-1.3.0-0.65.0.1.el7.x86_64, git-1.8.3.1-20.el7.x86_64' as str
  FROM dual
)
CONNECT BY REGEXP_SUBSTR(str, '[^ ]*(devel|git|nfs).+?(,|$)', 1, level) IS NOT NULL

输出:

LIB
libstdc++-devel-4.8.5-39.0.3.el7.x86_64,
nfs-utils-1.3.0-0.65.0.1.el7.x86_64,
git-1.8.3.1-20.el7.x86_64

注意,这会在某些名称的末尾留下逗号,如果要删除它们,只需使用RTRIM

SELECT RTRIM(REGEXP_SUBSTR(str, '[^ ]*(devel|git|nfs).+?(,|$)', 1, level), ',') AS lib
FROM (
  SELECT 'libstdc++-devel-4.8.5-39.0.3.el7.x86_64, python-kitchen-1.1.1-5.el7.noarch, nfs-utils-1.3.0-0.65.0.1.el7.x86_64, git-1.8.3.1-20.el7.x86_64' as str
  FROM dual
)
CONNECT BY REGEXP_SUBSTR(str, '[^ ]*(devel|git|nfs).+?(,|$)', 1, level) IS NOT NULL

输出:

LIB
libstdc++-devel-4.8.5-39.0.3.el7.x86_64
nfs-utils-1.3.0-0.65.0.1.el7.x86_64
git-1.8.3.1-20.el7.x86_64

Demo on dbfiddle

© www.soinside.com 2019 - 2024. All rights reserved.