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

时间:2017-09-13 11:18:35

标签: sql regex oracle

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

^[aeiou](*) 

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

^(*)[aeiou]$ 

它没有给出任何结果但是当我做^.*[aeiou]$时它给出了有效的结果。请解释两者含义的区别。感谢

2 个答案:

答案 0 :(得分:1)

区别在于(*)是无效的正则表达式而.*是有效的

*表示“前一个字符或表达式为零或更多”

.是“除换行符之外的任何字符”,因此.*是“任意数量的任何字符”

()用于分隔捕获组并且必须匹配。所以(不能是“前一个字符”

要在正则表达式中使用(,请使用\(获取文字括号并与之匹配

在regexp的某些实现中(例如在vim中),假设(被转义并且反向语法适用,因此\(成为组捕获括号

在这种情况下,(*)将匹配“任意数量(包括无,后跟a)”

注意:上面不是Oracle REGEXP_LIKE的情况,它似乎有自己的非标准语法,基于通常的PCRE或Unix grep,请参阅@ MT0下面的答案

答案 1 :(得分:1)

在Oracle 11中,似乎*+模式(在它们之前没有任何内容)生成零宽度匹配。因此(*)(+)分别捕获包含零宽度模式()*的群组+

所有这些查询都返回一行:

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的单行。

相关问题