Oracle REGEXP_LIKE 和\A 和\Z 的含义
Posted
技术标签:
【中文标题】Oracle REGEXP_LIKE 和\\A 和\\Z 的含义【英文标题】:Oracle REGEXP_LIKE and the meaning of \A and \ZOracle REGEXP_LIKE 和\A 和\Z 的含义 【发布时间】:2011-07-08 10:21:25 【问题描述】:我在 Oracle 存储过程中遇到了类似于以下的代码:
SELECT * FROM hr.employees WHERE REGEXP_LIKE(FIRST_NAME, '\A'||:iValue||'\Z', 'c');
我不确定 \A 和 \Z 是做什么的。
根据我从 Oracle 文档中收集到的信息,我认为它们只是抑制了 iValue 参数中特殊字符的含义。如果是这样,上面必须等价于
SELECT * FROM hr.employees WHERE FIRST_NAME=:iValue;
谁能证实这一点?根据经验,情况似乎如此。
我认为过去他们想要不区分大小写的搜索,因此之前的“c”是“i”。所以在这种情况下,我们不再需要使用 REGEXP_LIKE 函数,可以将其替换为等号。
【问题讨论】:
【参考方案1】:\A
匹配字符串开头的位置。
\Z
匹配字符串末尾的位置或在字符串末尾的换行符之前。
\z
匹配字符串末尾的位置。
这些独立于多行模式,不像^
和$
。
例子:
foo\Z
将匹配 foo\n
,但 foo\z
将不匹配 foo\n
。
见Oracle reference。
如果||
用于字符串连接,那么它与简单的字符串比较不同,因为它允许您使用正则表达式。 (另外我不确定Oracle在使用=
时如何处理区分大小写,mysql在比较字符串时默认忽略大小写。)
【讨论】:
Oracle 在比较字符串时始终区分大小写。【参考方案2】:\A
匹配输入的开头。\Z
匹配输入的结尾。
查看regular-expressions.info,这是一个很棒的正则表达式资源
【讨论】:
已经这样做了,谢谢。它还说“\Q...\E 从字面上匹配 \Q 和 \E 之间的字符,抑制特殊字符的含义”。它们是指 Q 和 E 还是只是一个例子? 它们的意思是\Q
和 \E
所以例如 \QQuick*-.\/\E
将匹配 Quick*-.\/
。
换句话说,正则表达式foo(\Q+-*/\E)
等价于foo(\+\-\*\/)
。 (
和 )
仍然组成一个组,但 \Q
和 \E
之间的字符失去了它们通常具有的任何特殊含义。以上是关于Oracle REGEXP_LIKE 和\A 和\Z 的含义的主要内容,如果未能解决你的问题,请参考以下文章
Oracle:to_number() 在 WHERE 子句中结合 substr() 和 regexp_like()