Sql 带有POSIX字符类的Oracle类regexp_模式

Sql 带有POSIX字符类的Oracle类regexp_模式,sql,regex,oracle,Sql,Regex,Oracle,我有这个模式的用户名 ref_2_34_aaa_dos ref_2_34_bbb_dos 我如何使用regexp\u这样的函数 SELECT username FROM all_users WHERE regexp_like(username, '^ref_2_34_[:alpha:]_dos$') 不起作用。我也不能像regexp\u一样使用ESCAPE“\”。这将导致语法错误。您需要将POSIX字符类[:alpha://code>放入括号表达式(即[…])中,并对其应用+量词: rege

我有这个模式的用户名

ref_2_34_aaa_dos
ref_2_34_bbb_dos
我如何使用regexp\u这样的函数

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

不起作用。我也不能像regexp\u一样使用ESCAPE“\”。这将导致语法错误。

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

regexp_like(username, '^ref_2_34_[[:alpha:]]+_dos$')
+
量词表示最后一个下划线和最后一个下划线之间可以有一个或多个字母

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

由于评论需要更多的澄清,这里是

括号表达式

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

  • 范围运算符:
    -

  • POSIX字符类:
    [::]

  • POSIX排序元素:
    […]

  • POSIX字符等价类:
    [=]

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

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

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

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


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

尝试
regexp\u like(用户名“^ref\u 2\u 34”[:alpha:]+\u dos$”)
。你能解释一下你做什么吗?谢天谢地,@Shawn-
[[:alpha:]
的可能副本看起来像某种巫毒,但它不是。事实上,它不是一组双方括号;这两对是分开的,意思不同。外部的表示“匹配列表”,内部的带有
:…:
的表示是一个字符类。您可以编写与
[a-zA-Z]
相同的代码,这意味着相同的事情。[:alpha:]与a-zA-Z的意思相同,即任何一个(单格)字母字符,大写或小写。更清楚地说明“双括号”问题的方法是做一些类似于
[:alpha:[:blank:][]
[:alpha:][]
的事情,表明
[:…:]
实体不必单独在外括号内。