我需要保持包含子字符串一部分的单词在线。例如:
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_64和nfs-utils -1.3.0-0.65.0.1.el7.x86_64。请注意,每行有几十个单词(不仅是四个单词),因此我需要调整模式以扩展结果(例如添加grub,perl等)。谢谢。
您的正则表达式有几个问题;它将匹配(例如)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