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中REGEXP_LIKE与LIKE的区别?

Oracle中REGEXP_LIKE与LIKE的区别

oracle regexp_like介绍和例子

Oracle:to_number() 在 WHERE 子句中结合 substr() 和 regexp_like()

在Oracle中使用REGEXP_LIKE和使用LIKE的性能哪个好

oracle正则表达式regexp_like的用法详解