。*是零个或多个字符的任何字符。我试图找到以元音开头的单词并使用
^[aeiou](*)
它给了我所有以元音开头的单词。当我^[aeiou].*
时给出相同的结果
现在我正在寻找以元音结尾的单词。我做了
^(*)[aeiou]$
它没有给出任何结果但是当我做^.*[aeiou]$
时它给出了有效的结果。请解释两者含义的区别。感谢
答案 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
的单行。