gpt4 book ai didi

regex - Oracle 11g - REGEXP_REPLACE - 子表达式/不同匹配

转载 作者:行者123 更新时间:2023-12-01 16:18:41 26 4
gpt4 key购买 nike

SQLFiddle:http://sqlfiddle.com/#!4/db1bd/49/0

我正在处理返回对象 DN 的查询:(cn=name,ou=folder,dc=hostname,dc=com)

我的目标是在类似于 AD 的“更漂亮”输出中返回此信息:(name\folder\hostname.com)

我用笨拙的方式完成了这个:

REGEXP_REPLACE(REGEXP_REPLACE(TEST, '.*CN=(.+?),DC=.*', '\1', 1, 1, 'i'), ',OU=', '\', 1, 0, 'i') -- grab everything between CN= and DC=, replace with \'s --
|| '\' ||
REGEXP_REPLACE(SUBSTR(TEST, REGEXP_INSTR(TEST, ',DC=', 1, 1, 0, 'i')+4),',DC=','.', 1, 0, 'i') -- grab everything after DC=, replace with .'s --

虽然这行得通,但我对它的复杂程度并不感到兴奋(而且它涉及到必须将两个正则表达式字符串拼接在一起)。

我从干净开始,意识到我做的太多而无法得到我想要的,现在我的起点就在这里:

REGEXP_REPLACE(test, '(,?(cn=|ou=)(.+?),)', '\3\')

认为我很清楚这个是如何工作的,但是如果我添加一个额外的 (...) 它会破坏我已经在工作的东西并返回整个字符串。我读到 Oracle 的正则表达式引擎不如其他一些引擎先进,但我正在努力掌握事物的评估顺序。

示例输入(可以有多个 OU/DC):

cn=name,ou=subgroup,ou=group,dc=accounts,dc=hostname,dc=com
cn=name,ou=group,dc=hostname,dc=com

预期输出

名称\子组\组\accounts.hostname.com
名称\组\hostname.com

传入的数据是动态的,而不是固定数量的 OU 或 DC。

最佳答案

你可以使用

SELECT REPLACE(
REGEXP_REPLACE(
test,
'(^|,)(cn|ou)=([^,]*)(,dc=)?',
'\3\\'),
',dc=',
'.')
FROM regexTest

参见 SQLFiddle .

第一个 (^|,)(cn|ou)=([^,]*)(,dc=)? 正则表达式匹配 , 或字符串的开头,然后是 cnou,然后是 =,然后将除逗号以外的零个或多个字符捕获到第 3 组中,然后匹配一个可选的 ,dc= 子字符串(因此,删除 ,dc= 的第一个实例)。替换为第 3 组内容和一个反斜杠。

因此,第二个操作很简单,只需将所有 ,dc= 替换为 ,为此您甚至不需要正则表达式。

关于regex - Oracle 11g - REGEXP_REPLACE - 子表达式/不同匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49391117/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com