首页 > 其他分享 >正则表达式:贪婪与非贪婪模式

正则表达式:贪婪与非贪婪模式

时间:2023-08-19 22:01:23浏览次数:37  
标签:匹配 贪婪 独占 正则表达式 模式 正则 与非 回溯

正则中的三种模式,贪婪匹配、非贪婪匹配和独占模式。

在这 6 种元字符中,我们可以用 {m,n} 来表示 (*)(+)(?) 这 3 种元字符:

正则表达式:贪婪与非贪婪模式_正则

贪婪模式,简单说就是尽可能进行最长匹配。非贪婪模式呢,则会尽可能进行最短匹配。正是这两种模式产生了不同的匹配结果。

贪婪匹配(Greedy)

在正则中,表示次数的量词默认是贪婪的,在贪婪模式下,会尝试尽可能最大长度去匹配。

非贪婪匹配(Lazy)

如何将贪婪模式变成非贪婪模式呢?我们可以在量词后面加上英文的问号 (?),正则就变成了 a*?

正则表达式:贪婪与非贪婪模式_正则_02

 独占模式(Possessive)

不管是贪婪模式,还是非贪婪模式,都需要发生回溯才能完成相应的功能。但是在一些场景下,我们不需要回溯,匹配不上返回失败就好了,因此正则中还有另外一种模式,独占模式,它类似贪婪匹配,但匹配过程不会发生回溯,因此在一些场合下性能会更好。

独占模式和贪婪模式很像,独占模式会尽可能多地去匹配,如果匹配失败就结束,不会进行回溯,这样的话就比较节省时间。具体的方法就是在量词后面加上加号(+)。

如果你用 a{1,3}+ab 去匹配 aaab 字符串,a{1,3}+ 会把前面三个 a 都用掉,并且不会回溯,这样字符串中内容只剩下 b 了,导致正则中加号后面的 a 匹配不到符合要求的内容,匹配失败。如果是贪婪模式 a{1,3} 或非贪婪模式 a{1,3}? 都可以匹配上。

正则表达式:贪婪与非贪婪模式_正则_03

正则中量词默认是贪婪匹配,如果想要进行非贪婪匹配需要在量词后面加上问号。贪婪和非贪婪匹配都可能会进行回溯,独占模式也是进行贪婪匹配,但不进行回溯,因此在一些场景下,可以提高匹配的效率,具体能不能用独占模式需要看使用的编程语言的类库的支持情况,以及独占模式能不能满足需求。


标签:匹配,贪婪,独占,正则表达式,模式,正则,与非,回溯
From: https://blog.51cto.com/key3feng/7152510

相关文章

  • python 小案例正则表达式
    正则表达式是一种用于匹配、查找和替换文本的强大工具。在提取网页中的目标数据时,可以使用正则表达式来搜索和匹配特定模式的文本。以下是一个使用正则表达式提取网页中的目标数据的示例代码:importre#网页源代码html="""<divclass="title">正则表达式教程</div><divc......
  • 正则表达式 过滤文本
    5.正则表达式过滤文本REGEXP:RegularExpressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。正则表达式被很多......
  • 第二十一节 API(正则表达式)
    正则表达式1.1正则表达式的概念及演示在Java中,我们经常需要验证一些字符串,例如:年龄必须是2位的数字、用户名必须是8位长度而且只能包含大小写字母、数字等。正则表达式就是用来验证各种字符串的规则。它内部描述了一些规则,我们可以验证用户输入的字符串是否匹配这个规则。先......
  • 记忆正则表达式的基本元件
    正则常见的三种功能,它们分别是:校验数据的有效性、查找符合要求的文本以及对文本进行切割和替换等操作。正则表达式,简单地说就是描述字符串的规则。在正则中,普通字符表示的还是原来的意思,比如字符a,它可以匹配“Hanmeimeiisagirl”中的H之后的a,也可以匹配is之后的a,这个和我......
  • 正则表达式工具
    packagecom.brainshare.common.utils;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/***正则表达式工具*/publicclassRegexUtil{privatestaticfinalStringREGEX_ID_CARD="(^\\d{15}$)|(^\\d{17}([0-9]|X)$)";/***身份证号校验......
  • 开源.NetCore通用工具库Xmtool使用连载 - 正则表达式篇
    【Github源码】《上一篇》详细介绍了Xmtool工具库中的日期时间类库,今天我们继续为大家介绍其中的正则表达式类库。在日常的软件开发过程中,每个人都会或多或少的遇到各种各样需要校验数据格式的需求,有些格式是和具体业务逻辑相关;而有些格式是业界标准,在任何系统和功能中都一致通用......
  • EF跟踪与非跟踪查询
    EF跟踪查询非跟踪查询  EntityFrameworkCore使用语言集成查询(LINQ)来查询数据库中的数据。  跟踪行为控制EntityFrameworkCore是否在其更改跟踪器中保留有关实体实例的信息。如果跟踪实体,在期间 SaveChanges,实体中检测到的任何更改将保存到数据库中。跟踪查询......
  • 正则表达式
    正则表达式概述正则表达式是一种用于匹配和处理文本模式的工具。它可以在文本中搜索、替换、分割和提取符合特定模式的字符串。使用正则表达式时,您可以根据需要构建适合的模式,然后将模式应用到目标文本中进行匹配和处理。正则表达式在文本处理、数据验证、文本分析等方面有着广......
  • PHP正则表达式匹配教程
    一、什么是正则表达式正则表达式是一种用于搜索、匹配、替换某种文本的字符串模式,常用于处理文本数据、校验输入数据等。在PHP中,可以使用preg系列函数(preg_match、preg_replace等)处理正则表达式。二、正则表达式语法正则表达式语法包含了一些特定的字符和语法规则,常用的语法规则......
  • 17. 正则表达式
    一、概述  正则表达式(regularexpression)又称规则表达式,是一种文本模式(pattern)。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式的核心功能就是处理文本。正则表达式并不仅限于某一种语言,但是在每种语......