正则表达式模式匹配顺序

     2023-02-22     302

关键词:

【中文标题】正则表达式模式匹配顺序【英文标题】:Regular Expression Pattern Matching order 【发布时间】:2012-06-17 02:04:10 【问题描述】:

在我熟悉的所有语言的正则表达式引擎中,.* 表示法表示匹配零个或多个字符。考虑以下 Javascript 代码:

var s = "baaabcccb";
var pattern = new RegExp("b.*b");
var match = pattern.exec(s);
if (match) alert(match);

这会输出baaabcccb

Python 也会发生同样的事情:

>>> import re
>>> s = "baaabcccb"
>>> m = re.search("b.*b", s)
>>> m.group(0)
'baaabcccb'

这两种语言都匹配"baaabcccb" 而不是简单的"baaab" 的原因是什么?我阅读模式b.*b 的方式是“找到一个以b 开头的子字符串,然后包含任意数量的其他字符,然后以b 结尾。” baaabbaaabcccb 都满足这个要求,但 Javascript 和 Python 都匹配后者。我原以为它会匹配baaab,仅仅是因为该子字符串满足要求并且首先出现。

那么为什么在这种情况下模式匹配baaabcccb?而且,是否有任何方法可以修改此行为(使用任何一种语言),以使其与 baaab 匹配?

【问题讨论】:

【参考方案1】:

因为 * 和 + 本质上是贪婪的(至少在 python 中,我不确定 js)。他们会尽量匹配。如果你想避免这个问题,你可以添加?在他们之后。

这里有一个很棒的教程,在贪婪与非贪婪部分: google python class

【讨论】:

【参考方案2】:

.* 是一个贪心匹配。 .*? 是非贪心版

【讨论】:

【参考方案3】:

您可以通过在* 之后添加? 来使正则表达式不贪婪,如下所示:b.*?b。然后它将匹配可能的最小字符串。默认情况下,正则表达式是贪婪的,并会尝试找到最长的匹配项。

【讨论】:

可能会添加默认情况下它是贪婪的,这意味着正则表达式将尝试匹配可能的最长字符串

以任何顺序匹配查询中的所有单词的正则表达式

】以任何顺序匹配查询中的所有单词的正则表达式【英文标题】:RegularExpressiontoMATCHALLwordsinaquery,inanyorder【发布时间】:2012-12-0408:46:18【问题描述】:我正在尝试为一个项目构建一个搜索功能,该功能根据用户搜索输入缩小项目... 查看详情

nginx配置location总结(代码片段)

...的location如果使用^~,则停止其他匹配(正则匹配)正则表达式指令匹配,按照配置文件里的顺序,成功就停止其他匹配如果第三步中有匹配成功,则使用该结果,否则使用第二步结果注意点匹配的顺序是先匹配普通字符串,然... 查看详情

正则表达式3--查找

用正则表达式执行查找命令,则需要用正则对象,其规则和执行顺序如下:指定为字符串的正则表达式必须首先被便以为此类的实例。然后,可将得到的正则对象匹配任意的字符串用于创建Mather对象,执行匹配所涉及的所有状态... 查看详情

与正则表达式部分匹配

】与正则表达式部分匹配【英文标题】:PartialmatchwithRegularExpression【发布时间】:2015-04-1211:25:43【问题描述】:当正则表达式需要特定数量的字符时,有没有办法确定单个字符是否有效?我有一个WPF自定义键盘,想根据正则表达... 查看详情

正则表达式仅在其长度大于值时才匹配模式

】正则表达式仅在其长度大于值时才匹配模式【英文标题】:Regextomatchapatternonlyifitslengthisbiggerthanavalue【发布时间】:2011-10-0604:45:04【问题描述】:我有2个字符串,想知道如果字符串2在同样的顺序这个子集的最小尺寸由我确定... 查看详情

模式匹配-正则表达式

模式匹配-正则表达式 主要内容:匹配内容,匹配模式,实现Java1.4起,Java核心API就引入了java.util.regex程序包,它包括两个类:Pattern和Matcher. Pattern是对正则表达式进行编译,得到正则表达式的表现模式。Matcher利用Pattern得到的... 查看详情

正则表达式的全局匹配模式

首先,要明确一点,所有的正则表达式都有一个lastIndex属性,用于记录上一次匹配结束的位置。如果不是全局匹配模式,那lastIndex的值始终为0,在匹配过一次后,将会停止匹配。正则表达式的全局匹配模式,就是在创建正则表... 查看详情

perl学习正则表达式

模式分组:/fred+/会匹配freddd这样的/(fred)+/会匹配fredfredfred这样的/(fred)*/则会匹配abcdef任意的圆括号同时也使得重新使用某些字符串成为可能。反向引用来引用圆括号中的模式所匹配的文字,这个行为我们称为捕获组。反向行为... 查看详情

正则表达式以任何顺序匹配字符串标记?

】正则表达式以任何顺序匹配字符串标记?【英文标题】:RegExtomatchStringtokensinanyorder?【发布时间】:2010-08-3117:02:56【问题描述】:我正在寻找可以按任何顺序匹配标记的Oracle正则表达式。例如,假设我正在寻找“一二”。我希... 查看详情

以任何顺序匹配正则表达式

】以任何顺序匹配正则表达式【英文标题】:Matchregexinanyorder【发布时间】:2013-09-2712:04:04【问题描述】:我想用正则表达式检查复杂的密码。它应该有1个数字1大写和一个小写字母,不按特定顺序。所以我想到了这样的事情:m=... 查看详情

javascript正则表达式模式匹配——分组模式匹配

1varpattern=/google{4,8}$/;//{4,8}$表示匹配结尾4-8次2varstr=‘googleeeeeeeee‘;//表示e的4-8次3alert(pattern.test(str));45varpattern=/(google){4,8}$/;//分组,可以看成一个字符6varstr=‘googlegooglegooglegoogle‘;//表示google4-8次7a 查看详情

javascript正则表达式模式匹配——特殊字符匹配换行模式

特殊字符匹配1varpattern=/[/;//用符号来转义正则里的特殊字符才能匹配2varstr=‘[‘;3alert(pattern.test(str));换行模式1varpattern=/d+/g;//未限定首匹配2varstr=‘1.baidu 2.google 3.bing‘;3alert(str.replace(pattern,‘#‘));45varpattern=/^d+ 查看详情

Redshift 正则表达式匹配直到模式匹配但不包含模式

】Redshift正则表达式匹配直到模式匹配但不包含模式【英文标题】:Redshiftregularexpressionmatchupuntilpatternmatchbutnotincludepattern【发布时间】:2017-07-1223:09:41【问题描述】:由于Redshift不支持前瞻断言,我需要一种方法来查找子字符串... 查看详情

正则表达式常用匹配模式

 1、邮箱验证:  查看详情

Java 正则表达式匹配数字模式

】Java正则表达式匹配数字模式【英文标题】:Javaregexmatchnumberpattern【发布时间】:2016-04-0409:59:31【问题描述】:我想检查我的号码是否与正则表达式匹配。我想要实现的是检查一个数字是否与模式匹配,而不是执行代码。我的if... 查看详情

正则表达式与特定模式完全匹配 10 位数字

】正则表达式与特定模式完全匹配10位数字【英文标题】:Regextomatch10digitexactlywithspecificpattern【发布时间】:2018-01-2918:07:23【问题描述】:假设我给出一个模式123*或1234*,我想匹配以该模式开头的任何10位数字。它应该正好有10位... 查看详情

为啥这个正则表达式模式不匹配? [复制]

】为啥这个正则表达式模式不匹配?[复制]【英文标题】:Whydoesthisregexpatternnotmatch?[duplicate]为什么这个正则表达式模式不匹配?[复制]【发布时间】:2018-06-0218:24:23【问题描述】:Regex101链接:https://regex101.com/r/MsZy0A/2我有以下正... 查看详情

正则表达式:匹配除特定模式之外的所有内容

】正则表达式:匹配除特定模式之外的所有内容【英文标题】:Regex:matcheverythingbutspecificpattern【发布时间】:2010-12-1320:14:30【问题描述】:我需要一个能够匹配所有内容的正则表达式但是一个以特定模式开头的字符串(特别是ind... 查看详情