正则表达式里面 .* 和 .*? 有什么区别?

作者&投稿:阮喻 (若有异议请与网页底部的电邮联系)
正则表达式中 .* 与 .? 与 .*? 这三种写法的区别是什么?~

.匹配任意字符,*表示重复任意次数,在*,+后的?表示非贪婪匹配 ,单个?表示匹配0或1次

.* 匹配尽可能多的字符
.*? 只匹配满足正则的最小字符串
.? 匹配 任意一个字符 ,或者在此位置无字符
如 字符串"acbabc" 正则"^.*b"匹配 "acbab",正则"^.*?b"匹配 "acb"

表达式 .* 就是单个字符匹配任意次,即贪婪匹配。 表达式 .*? 是满足条件的情况只匹配一次,即最小匹配.
\s 匹配任何空白非打印字符,包括空格、制表符、换页符等等。等价于 [ \f
\v]。注意 Unicode 正则表达式会匹配全角空格符。
\S 匹配任何非空白非打印字符。等价于 [^ \f
\v]。
*限定符是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
比如:Chapter 1 - 介绍正则表达式
使用//匹配的结果为:H1>Chapter 1 - 介绍正则表达式</H1。
使用//匹配结果为:H1。
拓展知识
正则表达式特殊字符及其含义

表达式 .* 就是单个字符匹配任意次,即贪婪匹配。 
表达式 .*? 是满足条件的情况只匹配一次,即最小匹配.

\s    匹配任何空白非打印字符,包括空格、制表符、换页符等等。等价于 [ \f
\v]。注意 Unicode 正则表达式会匹配全角空格符。   

\S    匹配任何非空白非打印字符。等价于 [^ \f
\v]。    

*限定符是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。

比如:<H1>Chapter 1 - 介绍正则表达式</H1>

使用/<.*>/匹配的结果为:H1>Chapter 1 - 介绍正则表达式</H1。

使用/<.*?>/匹配结果为:H1。

拓展知识

正则表达式特殊字符及其含义



\s匹配任意的空白符(包括空格,制表符(Tab),换行符,中文全角空格)
\S则是任意不是空白符的字符

?涉及到贪婪模式
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:

a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)

\s匹配任意的空白符(包括空格,制表符(Tab),换行符,中文全角空格)
\S则是任意不是空白符的字符

?涉及到贪婪模式
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:

a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)

\w 等价于 [a-zA-Z0-9_]
\W 等价于 [^a-zA-Z0-9_],就是排除了\w的情况,也就是说它们表示的意思相反

.*? 是匹配表达式中的一个,可以为空
.+? 是匹配表达式中的一个,不可以为进空


泾川县18974595944: 正则表达式(规则表达式) - 搜狗百科
虞谢盐酸: *——表示匹配前面的字符0个或多个 +——表示前面的字符1个或多个 ?——(1)放在其他字符后面表示前面的字符可以有,也可以没有 (2)放在*、+后面表示匹配尽可能少的字符 例如:字符串fooooo,正则fo*和fo+会匹配整个字符串, fo+? 匹配fo, fo*? 匹配f *+没有这样的用法,除非是匹配星号本身,即: \*+ 表示一个或多个星号

泾川县18974595944: 正则表达式中的 *?或 * 是什么意思 -
虞谢盐酸: 乘号,乘以 请采纳,你的采纳是我上进的动力!可以追问,一直到懂!!

泾川县18974595944: 正则里的(.*?)是什么意思 -
虞谢盐酸: . 是任意字符 可以匹配任何单个字符,例子:正则表达式r.t 可以匹配这些字符串:rat、rut、r t,但是不匹配root. .*? 表示匹配任意字符到下一个符合条件的字符 例子:正则表达式a.*?xxx 可以匹配 abxxx axxxxx abbbbbxxx 扩展资料:* 匹配0或多...

泾川县18974595944: 求大神解答:正则表达式.*?与(.*?)有什么区别 -
虞谢盐酸: ()中的内容会作为捕获组的匹配结果.使用与不使用捕获组至少有下列区别:1.捕获组是一个整体,如(a.)*表示匹配字母a和任意字符的组合若干次,而a.*表示匹配一个字母a和若干个任意字符.同时,如果既想分组又不想参与捕获可以使用非捕获组:(?:a.)*2.re.findall()方法只会返回所有捕获组的列表3.match对象的group()方法可以返回捕获组,如group(1)返回第1捕获组的内容,group(2)返回第2捕获组的内容,甚至支持命名捕获组如group('path')4.捕获组匹配的内容可作为反向引用使用,如\1表示此处应匹配第1捕获组捕获到的内容.

泾川县18974595944: 正则表达式中 .*? 代表什么? -
虞谢盐酸: 点 是任意字符* 是取 0 至 无限长度 问号 是非贪婪模式.何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:.*?a 就是取前面任意长度的字符,到底一个 a 出现,匹配如下 q@wer_qwerqweraljlkjlkjlkj 得到:q@wer_qwerqwera 这部分,如果匹配不到后面的 a 字符,则匹配为空.

泾川县18974595944: 正则表达式中.*是什么意思 -
虞谢盐酸: *是通配符的一种,表示任意多个字符,.*则表示后缀名为任意的文件即所有文件. 希望可以帮到您.

泾川县18974595944: 正则表达式中 +*? 表示什么? -
虞谢盐酸: + 一个或者一个以上的匹配 * 零个或者零个以上的匹配 ? 零个或者一个匹配

泾川县18974595944: 正则表达式 .*? 是什么意思啊? -
虞谢盐酸: 表达式 .* 就是单个字符匹配任意次,即贪婪匹配. 表达式 .*? 是满足条件的情况只匹配一次,即最小匹配. 举例介绍: 如:<img src="test.jpg" width="60px" height="80px"/> 懒惰模式正则: src=".*?" 结果:src="test.jpg" 扩展资...

泾川县18974595944: 正则表达式 (.*) .* 就是这2种写法,有什么却别?分别代表什么含义? -
虞谢盐酸: .* 代表的是通配符 外边有括号的和不写括号区别在于括号的用法 在正则表达式中 ()表示模式单元 当()的正则式匹配时 可以通过调用模式单元的方法调用匹配的内容 用//1 这种格式 调用

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网