。*是零个或多个次数的任何字符。我试图找到以元音开头的单词,我用过
^[aeiou](*)
它给了我所有以元音开头的单词。当我这样做时,也会得到相同的结果。^[aeiou].* 现在,我正在寻找以元音结尾的单词。我做了
^[aeiou].*
^(*)[aeiou]$
它没有给出任何结果,但是当我这样做时却^.*[aeiou]$给出了有效的结果。请解释两者含义上的差异。谢谢
^.*[aeiou]$
看起来,在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模式匹配都不会返回任何行:
NULL
SELECT * FROM DUAL WHERE REGEXP_LIKE( NULL, '*' ); SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', NULL );
使用REGEXP_SUBSTR:
REGEXP_SUBSTR
SELECT REGEXP_SUBSTR( '1', '+' ) FROM DUAL;
输出包含的单行NULL。