.*是任何字符0或更多次的次数。我试图找出以元音开头的单词,然后我用
^[aeiou](*)
它给了我所有以元音开头的单词。同样的结果是,当我做^[aeiou].*
时,我正在寻找以元音结尾的单词。我做到了
^(*)[aeiou]$
它没有给出结果,但是当我做^.*[aeiou]$
时,它给出了有效的结果。请解释两者含义的不同之处。谢谢
发布于 2017-09-13 04:46:14
看来,在Oracle11中,*
和+
模式(之前没有任何模式)生成零宽度匹配。因此,(*)
和(+)
分别捕获包含零宽度模式*
或+
的组()
。
所有这些查询都返回一行:
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '*' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '(*)' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^*' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^(*)' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '*1' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '+' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '(+)' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^+' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^(+)' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '+1' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^+1' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '+1$' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^+1$' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '()' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '12', '1(*)2' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '12', '1(+)2' );
这些查询不返回任何行:
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '*2' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^*$' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^+$' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '12', '11(*)2' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '12', '11(+)2' );
此外,将任何模式与NULL
或字符串与NULL
模式匹配将不会返回任何行:
SELECT * FROM DUAL WHERE REGEXP_LIKE( NULL, '*' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', NULL );
使用REGEXP_SUBSTR
SELECT REGEXP_SUBSTR( '1', '+' ) FROM DUAL;
输出包含NULL
的一行。
发布于 2017-09-13 03:28:11
区别在于(*)
是无效的regexp,而.*
是有效的。
*
的意思是“前一个字符或表达式的零或多个”。
.
是“除换行符外的任何字符”,所以.*
是“任意数目的任何字符”。
(
和)
用于分隔捕获组,必须匹配。因此,(
不能是“前一个字符”
若要在regexp中使用(
,请使用\(
获取文字括号并与之匹配。
在regexp的某些实现中(例如,在vim中),假定(
被转义,并应用反向语法,因此\(
成为组捕获括号。
在这种情况下,(*)
将匹配“任意数量的(包括零,后面跟着a )”。
注:上述情况对甲骨文REGEXP_LIKE来说并非如此,它似乎有自己的、非标准的语法,大致基于通常的PCRE或Unix,参见下面@MT0的答案。
https://stackoverflow.com/questions/46196134
复制相似问题