sql - REGEXP Oracle 的几个 not 语句

标签 sql regex oracle

我有一个由逗号分隔的 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/

相关文章:

php 在 500 字后将字符串插入到 html 中?包含 html 标签

java - 如何从java将数据CLOB和BLOB类型发送到数据库

c++ - Qt 没有链接到 sql

php - SQL:插入$_POST并输出JSON

php - 如何在 codeigniter 中获取 mysql 表的字段名称?

javascript - 如何在javascript中一次用其他多个字符串替换多个字符串?

MYSQL Left Join 如何选择 NULL 值?

javascript - 从字符串中取出单词并转换为数组

java - 在 Java 中设置默认模式名称

oracle - 访问 ID 列表时的 Top N 查询性能