具有POSIX字符类的Oracle regexp_like模式

时间:2016-08-25 20:12:14

标签: sql regex oracle

我有这种模式的用户名

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。它会给出语法错误。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

由于评论需要更多说明,因此some bracket expression and POSIX character class reference

括号表达式

  

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

     
      
  • 范围运算符:-
  •   
  • POSIX字符类:[: :]
  •   
  • POSIX整理元素:[. .]
  •   
  • POSIX字符等值类:[= =]
  •   
     

短划线(-)是列表中第一个或最后一个出现的文字,或者是[#--]中范围表达式中的结束范围点。如果右括号(])首先出现在列表中,则将其视为文字。

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

  

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

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

或者,要模仿尾随字边界,可以使用[^_[:alnum:]](例如,以($|[^_[:alnum:]])模式)匹配任何字符,但_,数字和字母({{ 1}}匹配字母数字符号)。