【发布时间】:2019-03-10 18:42:23
【问题描述】:
我有一个用逗号分隔的 4 个名称的字符串。 4 个名称中的 3 个内部有严格的标识符,最后一个没有标识符。字符串中名称的顺序是随机的。如何使用 oracle REGEXP 获取没有标识符的名称?
示例字符串:'a. Name1, b. Name2, Name3, c-f Name4'
严格标识符为'a.'、'b.'、'c-f'
name1、name2和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 中不直接支持),我认为 not/and 模式是不可能的。你需要找到一种更有创意的方法。
-
对,没有前瞻就无法否定一系列字符。在一些奇异的正则表达式风格中还有其他构造,Oracle 正则表达式不是其中之一。
-
如何定义“严格标识符”?对或错:您可以通过注意模式 comma-space-(nonspace, non-comma characters)-comma? 来识别没有严格标识符的名称?前导“逗号空格”可能是“字符串开头”,和/或尾随逗号可能是“字符串结尾”?好像是这样的。如果正确,它还会直接告诉你如何编写正则表达式。
-
@mathguy 我需要这样的东西:'(^|, )((NOT("a."))and(NOT("b."))and(NOT("c-f") ))([^,]+($|,)'
-
@Room'on - 您没有回答我的问题(对或错,关于您如何 识别没有严格标识符的名称)。编写一个仅对几个特定标识符进行硬编码的解决方案是没有意义的;如果您对
a.和b.进行硬编码,对于t. name等输入,查询将无法正常工作,对吗?