一尘不染

regexp中的(*)和。*有什么区别?

sql

。*是零个或多个次数的任何字符。我试图找到以元音开头的单词,我用过

^[aeiou](*)

它给了我所有以元音开头的单词。当我这样做时,也会得到相同的结果。^[aeiou].* 现在,我正在寻找以元音结尾的单词。我做了

^(*)[aeiou]$

它没有给出任何结果,但是当我这样做时却^.*[aeiou]$给出了有效的结果。请解释两者含义上的差异。谢谢


阅读 192

收藏
2021-03-08

共1个答案

一尘不染

看起来,在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

2021-03-08