我有这种模式的用户名
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。它会给出语法错误。
答案 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}}匹配字母数字符号)。