【问题标题】:Oracle regexp pattern matching instances of a but not abOracle 正则表达式模式匹配 a 但不是 ab 的实例
【发布时间】:2017-11-15 18:46:15
【问题描述】:

我从 oracle 文档中看到我可以执行 a|b 匹配字符“a”或字符“b”的所有实例。我想知道在正则表达式中是否有可能有'a'而不是'b',例如匹配 'a' 的所有实例,但 a 后跟 'b' 除外。

所以用这 3 个字符串

  1. AAAA
  2. ACAD
  3. AAAB

我想匹配 1 和 2 但不是 3。

【问题讨论】:

  • #3 (AAAB) 不匹配 A 后跟非 B 的位置吗? (第一个AA部分)
  • 'a' and not 'b' 与“除了 'a' 后跟 'b'”完全不同。字符串 'ba' 不满足条件 [ 'a' 而不是 'b' ] 因为它确实有一个 'b',但它没有出现在 'a' 之后。请澄清。此外,如果您的真正意思是“跟随” - 这是否意味着 立即 跟随,或者它是否意味着“跟随 somewhere 在字符串的后面,不一定立即 在“a”之后?
  • 你只需要检查字符串中是否没有ABcol NOT LIKE '%AB%' AND col LIKE '%A%'

标签: regex oracle regex-negation


【解决方案1】:

你可以试试:

with x as (
  select 'AAAA' as str from dual
  union all
  select 'ACAD' as str from dual
  union all
  select 'AAAB' as str from dual
)
select * from x
where regexp_like(str, '[aA][^bB]')
and NOT regexp_like(str, '[aA][bB]')

输出:

AAAA
ACAD

注意:如果您不关心 A 后面是否有其他非 B 字符,您可以简单地这样做:

with x as (
  select 'AAAA' as str from dual
  union all
  select 'ACAD' as str from dual
  union all
  select 'AAAB' as str from dual
)
select * from x
where regexp_like(str, '[aA]')
and NOT regexp_like(str, '[aA][bB]')

匹配“AAAA”或“XYZA”

【讨论】:

  • WHERE中的第一个条件不过量; OP 并没有说他需要一个 A,然后是其他东西。事实上,A 可以在字符串的末尾(甚至整个字符串都可以是 'A')。
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多