我有一个由逗号分隔的 4 个名称的字符串。 4 个名称中的 3 个在内部有严格的标识符,最后一个没有标识符。字符串中名称的顺序是随机的。如何使用 oracle REGEXP 获取没有标识符的名称?
示例字符串:'a.姓名 1,b。姓名 2、姓名 3、c-f 姓名 4'
严格标识符是'a.'
、'b.'
、'c-f'
name1
, name2
and name4
我可以这样获取:
select
regexp_substr('a. Name1, b. Name2, Name3, c-f Name4','(^|, )a.[^,]+($|,)') as name1,
regexp_substr('a. Name1, b. Name2, Name3, c-f Name4','(^|, )b.[^,]+($|,)') as name2,
regexp_substr('a. Name1, b. Name2, Name3, c-f Name4','(^|, )c\-f[^,]+($|,)') as name4
from dual
我想使用类似这样的方法获取 name3:
'(^|, )((NOT("a."))and(NOT("b."))and(NOT("c-f")))([^,]+($|,)'
但是我不知道如何用 REGEXP 来做。在 Oracle 中可以吗?
最佳答案
这将匹配第三个反向引用(任何用方括号包围的模式)。
REGEXP_REPLACE(
yourStringColumn,
'a\. (.*), b\. (.*), (.*), c-f (.*)',
'\3'
)
我使用的模式中有 4 个反向引用,每个都是您要查找的名称。模式的其余部分(背面引用之外)是您描述的模式的固定部分。请记住转义句号,这样它就不会被视为通配符 ('\.'
)
编辑:
如果它们可以按任何顺序排列,我最好的尝试是在逗号(或字符串的开头/结尾)之间找到一个本身不包含逗号或空格(空格暗示有前缀)的项目
SELECT
regexp_replace(
'c-f Name1, Name2, b. Name3, a. Name4',
'(^|.+, )([^, ]+)($|, .+)',
'\2'
)
FROM
dual
;
关于sql - REGEXP Oracle 的几个 not 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55091074/