【问题标题】:Oracle regexp_like pattern with POSIX character class具有 POSIX 字符类的 Oracle regexp_like 模式
【发布时间】:2016-08-25 20:12:13
【问题描述】:

我有这种模式的用户名

ref_2_34_aaa_dos
ref_2_34_bbb_dos

我如何使用 regexp_like 来做这个?

SELECT username FROM all_users WHERE regexp_like(username, '^ref_2_34_[:alpha:]_dos$')

不起作用。我也不能将 ESCAPE '\' 与 regexp_like 一起使用。它会给出一个语法错误。

【问题讨论】:

标签: sql regex oracle


【解决方案1】:

您需要将 POSIX 字符类 [:alpha:] 放入括号表达式(即 [...])并对其应用 + 量词:

regexp_like(username, '^ref_2_34_[[:alpha:]]+_dos$')

+ 量词表示在最后一个和最后一个下划线之间可以有 1 个或多个字母。

如果您的字符串在该位置可能没有用户名(它是空的),并且您也想获取这些条目,则需要将加号替换为匹配 零 的 * 量词em> 或更多次出现的量化子模式。

由于 cmets 需要更多说明,这里是some bracket expression and POSIX character class reference

括号表达式

匹配括号内列表中的任何单个字符。列表中允许使用以下运算符,但包含的其他元字符被视为文字:

  • 范围运算符:-
  • POSIX 字符类:[: :]
  • POSIX 排序规则元素:[. .]
  • POSIX 字符等价类:[= =]

破折号 (-) 是一个文字,当它出现在列表中的第一个或最后一个时,或者作为范围表达式中的结束范围点时,如 [#--]。如果右括号 (]) 出现在列表的第一个位置,则将其视为文字。

POSIX 字符类(可以是括号表达式的一部分):

[:class:] - 匹配属于指定 POSIX 字符类的任何字符。您可以使用此运算符搜索具有特定格式的字符,例如大写字符,也可以搜索特殊字符,例如数字或标点字符。支持全套 POSIX 字符类。 ... 表达式[[:upper:]]+ 搜索一个或多个连续的大写字符。

括号表达式可以被认为是一种用于多个原子的“容器”构造,作为一个完整的正则表达式单元,它与您定义的某些字符类匹配。如果您需要匹配<,或>,或字母,您可以将它们组合成一个括号表达式[<>[:alpha:]]。要匹配零个或多个<> 或字母,请在] 之后添加* 量词:[<>[:alpha:]]*

或者,为了模仿结尾的单词边界,可以使用[^_[:alnum:]](例如,在($|[^_[:alnum:]]) 模式中)匹配除_、数字和字母之外的任何字符([:alnum:] 匹配字母数字符号)。

【讨论】:

  • @Shawn - [[:alpha:]] 看起来像是某种巫术,但事实并非如此。事实上,它不是一组双方括号;这两对是分开的,意味着不同的东西。外部的意思是“匹配列表”,而带有:...: 的内部是一个字符类。你可以写和[a-zA-Z]一样的写法,意思是一样的。 [:alpha:] 与 a-zA-Z 的含义相同,即任何一个(单个)字母字符,大写或小写。
  • 演示“双括号”问题的更清晰方法是执行[[:alpha:][:blank:]][<>[:alpha:]] 之类的操作,表明[:...:] 实体不必单独位于外括号内.
猜你喜欢
  • 1970-01-01
  • 2015-05-30
  • 2013-05-12
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多