Perl 中的贪婪与非贪婪匹配

正则表达式(Regex/RE) 是一系列用于模式匹配的字符序列。换句话说,它是一种无需在程序中列出所有字符串即可描述一组字符串的方法。我们可以通过使用模式绑定操作符 =~!~ 来应用正则表达式。正则表达式操作符 =~ 用于测试正则表达式的匹配。
示例: 让我们考虑 /geeks/ 作为一个正则表达式。它将匹配

Geeksforgeeks
Computergeeks

但不匹配

Ge12eksg22eeks
Geeksg*eks

!~ 用于判定正则表达式应用于哪个变量,并对匹配结果取反;如果匹配成功则返回 false(假),如果匹配失败则返回 true(真)。以上面的例子为例,之前结果为 true 的表达式将被视为 false,而 false 的正则结果将被视为 true。这相当于对使用 =~ 获得的结果进行了逻辑非运算。

模式匹配: 这是一种在给定字符串中查找特定字符序列或模式的方法。在 Perl 中,我们有三个正则表达式操作符。它们分别是:

匹配正则表达式 - **m//**
替换正则表达式 - **s//**
转换正则表达式 - **tr//**

示例 1:使用匹配操作符

Perl


CODEBLOCK_136c7a64

!image

在上面的示例中,我们使用匹配操作符 ‘m//‘ 进行模式匹配,以在字符串中搜索特定的子串。如果在字符串中找到了该模式,它将返回 true。

示例 2:使用替换操作符

Perl


CODEBLOCK_e240b840

!image

在这里,替换操作符 ‘s///‘ 用于将字符串中的某个模式替换为给定的文本。如果该模式存在,它将被替换;否则,它将返回 false。

示例 3:使用转换操作符

Perl


CODEBLOCK_110dff59

!image

在这里,程序使用转换操作符 ‘tr///‘ 搜索字符串中所有出现的字符 ‘G‘,并将其替换为另一个字符 ‘S‘。即使没有进行任何替换,它也永远不会返回 false。

贪婪匹配与非贪婪匹配

正则表达式匹配的通用规则有时被称为“最左最长”:当一个模式可以在字符串中的多个位置进行匹配时,所选的匹配将是字符串中最早可能开始的位置,然后尽可能向后延伸。通常,Perl 的模式匹配是贪婪的。所谓贪婪,我们的意思是解析器会尝试尽可能多地匹配。例如,在字符串 abcbcbcde 中,模式

贪婪和非贪婪匹配 /(bc)+/ 可以有六种不同的匹配方式,如图所示:

!image

在上图中,这些匹配模式中的第三个是“最左最长”,也称为贪婪匹配。然而,在某些情况下,我们可能希望获得“最左最短”或最小匹配。我们可以在 RE 的末尾使用 ‘?‘ 将贪婪匹配变为非贪婪匹配,即 ‘*?‘ 匹配前一个子表达式的最小实例数,只要能让整体匹配成功即可。类似地,‘+?‘ 至少匹配一个实例,但不超过允许整体匹配成功所需的数量,而 ‘??‘ 匹配零个或一个实例,优先选择零个。

!image

示例:贪婪模式匹配

Perl


CODEBLOCK_652d97a6

!image

在这里我们可以看到,代码将从 k 开始匹配到 s,并且会尽可能多地匹配字符。

示例:非贪婪模式匹配

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/40034.html
点赞
0.00 平均评分 (0% 分数) - 0