首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >(*)和.*在regexp中有什么区别?

(*)和.*在regexp中有什么区别?
EN

Stack Overflow用户
提问于 2017-09-13 03:18:34
回答 2查看 508关注 0票数 2

.*是任何字符0或更多次的次数。我试图找出以元音开头的单词,然后我用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
^[aeiou](*) 

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
^(*)[aeiou]$ 

它没有给出结果,但是当我做^.*[aeiou]$时,它给出了有效的结果。请解释两者含义的不同之处。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-13 04:46:14

看来,在Oracle11中,*+模式(之前没有任何模式)生成零宽度匹配。因此,(*)(+)分别捕获包含零宽度模式*+的组()

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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' );

这些查询不返回任何行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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模式匹配将不会返回任何行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM DUAL WHERE REGEXP_LIKE( NULL, '*' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', NULL );

使用REGEXP_SUBSTR

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT REGEXP_SUBSTR( '1', '+' ) FROM DUAL;

输出包含NULL的一行。

票数 1
EN

Stack Overflow用户

发布于 2017-09-13 03:28:11

区别在于(*)是无效的regexp,而.*是有效的。

*的意思是“前一个字符或表达式的零或多个”。

.是“除换行符外的任何字符”,所以.*是“任意数目的任何字符”。

()用于分隔捕获组,必须匹配。因此,(不能是“前一个字符”

若要在regexp中使用(,请使用\(获取文字括号并与之匹配。

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

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

注:上述情况对甲骨文REGEXP_LIKE来说并非如此,它似乎有自己的、非标准的语法,大致基于通常的PCRE或Unix,参见下面@MT0的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46196134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文