简单聊一聊正则表达式中的贪婪匹配和非贪婪匹配

1. 贪婪匹配

在JS中利用正则表达式时,默认的匹配就是贪婪匹配,也就是尽可能多的去匹配,举个例子:

var s = 'aaa';
var regexp = /a+/; // 匹配1个或多个a,贪婪匹配
console.log(regexp.exec(s)[0]); // 'aaa'

在上面的例子中,匹配到了 ‘aaa‘

2. 非贪婪匹配

我们同样可以进行非贪婪匹配只需要在正则表达式待匹配的字符后面加上一个 ? 即可。

还是上面的例子:

var s = 'aaa';
var regexp = /a+?/; // 匹配1个或多个a,非贪婪匹配
console.log(regexp.exec(s)[0]); // 'a'

进行非贪婪匹配之后,可以看到只匹配到了 ‘a‘

3. 特殊的例子

请问下面的代码输出什么?

var s = 'aaab';
var regexp0 = /a+?b/; // 非贪婪匹配
var regexp1 = /a+b/; // 贪婪匹配
console.log(regexp0.exec(s)[0]); // 'aaab'
console.log(regexp1.exec(s)[0]); // 'aaab'

进行非贪婪匹配时或许我们心中的答案是 ‘ab‘ ,但是实际上匹配结果和贪婪匹配时一样为 ‘aaab‘

这是因为:正则表达式的模式匹配总是会寻找字符串中第一个可能匹配的位置。

在字符串 ‘aaab‘ 中第一个 ‘a‘ 就匹配上了,会接着往下匹配,直到匹配上 ‘b‘

完,如有不恰当之处,欢迎指正哦。

原文地址:https://www.cnblogs.com/zhangguicheng/p/12098538.html

时间: 2024-10-14 17:56:14

简单聊一聊正则表达式中的贪婪匹配和非贪婪匹配的相关文章

正则表达式中的贪婪模式与非贪婪模式详解

1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NFA引擎所支持. 属于贪婪模式的量词,也叫做匹配优先量词,包括: “{m,n}”.“{m,}”.“?”.“*”和“+”. 在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括: “{m,n}?”.“{m,}?”.“??”.“*?”和“+?”.

正则表达式话题 【正则表达式--递归匹配与非贪婪匹配 】

[出处:http://www.regexlab.com/zh/regtopic.htm] 引言 本文将逐步讨论一些正则表达式的使用话题.本文为本站基础篇之后的扩展,在阅读本文之前,建议先阅读正则表达式参考文档一文. 1. 表达式的递归匹配 有时候,我们需要用正则表达式来分析一个计算式中的括号配对情况.比如,使用表达式 "\( [^)]* \)" 或者 "\( .*? \)" 可以匹配一对小括号.但是如果括号 内还嵌有一层括号的话 ,如 "( ( ) )&q

Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配

Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配 //贪婪匹配 var   reg: TPerlRegEx; begin   reg := TPerlRegEx.Create(nil);   reg.Subject := '<html><head><title>标题</title></head><body>内容</body></html>';   reg.RegEx  := '<.*>';

贪婪模式与非贪婪模式

一.概念 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="abcaxc"; Patter p="ab*c"; 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配.如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c). 非贪婪匹配:就是匹配到结果就好,就少的匹配字符.如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c). 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式

shell 中 贪婪匹配 和 非贪婪匹配

举个栗子: v=jfedu.shiyiwen.com echo ${v%.*} 一个%为非贪婪匹配,即匹配最短结果.%从右到左进行非贪婪匹配,匹配什么呢? 匹配已 .*的字符. 那么当然是匹配到了.com 然后执行删除匹配到的字符.结果就是(这里的 "." 相当于定界符.而“*”是通配符) jfedu.shiyiwen echo ${v%%.*} 而这里执行贪婪匹配,即匹配最长结果就匹配到了 .shiyiwen.com 结果为 jfedu 这里在说一个 # 刚好和 %顺序相反而已,#是

Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配《转》

//贪婪匹配 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := '<html><head><title>标题</title></head><body>内容</body></html>'; reg.RegEx := '<.*>'; //将会全部匹配, 因为两头分别是: < 和 > reg.Rep

PHP正则 贪婪匹配与非贪婪匹配

$str = ".abcdeabcde"; preg_match('/a.+?e/', $str, $match); print_r($match); Array ( [0] => abcdeabcde ) -------------------------- 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配,默认情况下是贪婪模式; preg_match('/a.+?e/', $str, $match); print_r($match); Array ( [0]

java 正则表达式获取匹配和非获取匹配

1 package test1; 2 3 import java.util.regex.Matcher; 4 import java.util.regex.Pattern; 5 6 public class TestExp { 7 /** 8 * 9 * 在使用正则表达式的时候,我们经常会使用()把某个部分括起来,称为一个子模式. 子模式有Capturing和Non-Capturing两种情况. 10 * Capturing指获取匹配 : 11 * 是指系统会在幕后将所有的子模式匹配结果保存起来

贪婪匹配和非贪婪匹配

贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配 string pattern1 = @"a.*c";   // greedy match Regex regex = new Regex(pattern1); regex.Match("abcabc"); // return "abcabc" 非贪婪匹配:在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配 string pattern1 = @"a.*?c&