Perl 正则表达式中的回溯操作

Perl 正则表达式中的回溯操作

在Perl中,正则表达式(又称regexes或regexps或REs)是一种描述一组字符串的方法,而不必在你的程序中列出所有的字符串,或者我们可以简单地说,它是一个用于模式匹配的字符序列。在Perl中,正则表达式有不同的用途。

  • 首先,它们被用于条件式中,以确定一个字符串是否与一个特定的模式相匹配。

例子:正则表达式在条件式中的使用。

#!usr/bin/perl
  
# Regular expressions in Conditionals
# Program to determine whether a string 
# matches a particular pattern
print "How are you feeling today?\n";
my stmt = <>;
print(stmt);
if (stmt == /hungry/)
{
    print "\nWhat would you like to have?\n";
    myip = <>;
    print($ip);
}

输出:

Perl  正则表达式中的回溯操作

在这里,用户提供的输入被匹配,如果我们有一个词 “饿”,也就是说,如果条件为真,它将打印 “你会有什么?”否则,它将跳到下一个条件或一个语句。

  • 其次,它们可以在一个字符串中定位模式,并可以用其他东西替换它们。

例子:替换运算符

#!usr/bin/perl
# Regular expressions in Substitutions
  
# Program to determine whether a string 
# matches a particular pattern and replaces it
print "What is your thought on life\n";
my stmt = <>;
print (stmt);
  
# Substitution using regex
stmt =~ s/worst/good/;
print ("\nstmt");

输出:
Perl  正则表达式中的回溯操作

在上述代码中,用 “好 “代替了 “最差”。

  • 最后,模式不仅可以指定某些东西在哪里,也可以指定它不在哪里。所以split操作符使用正则表达式来指定数据不在哪里。也就是说,正则表达式定义了划分数据字段的分隔符。

示例:拆分运算符

#!usr/bin/perl
  
# Program to illustrate 
# the use of split function
var1 = "Birth";var2 = "Life";
var3 = "Death";
  
# Using the split function
my (var1, var2,var3) = split(/, /, "sab, mohmaya, hai");
print(var1);
print(var2);
print($var3);  

输出:

Perl  正则表达式中的回溯操作

在这里,在上面的例子中,分割函数在单个逗号字符上匹配。

回溯

正则表达式匹配的另一个重要特征是回溯,目前所有的正则非占有式表达式量词(用于计算所有匹配的总数,而不是默认的只匹配一次),即 **?++?{n, m}{n, m},都使用了回溯(需要时)。回溯通常在内部进行优化,但这里概述的一般原则是有效的(它是从一棵可能的树上的不成功的递归中返回)。
例如: /.*?/可能被用来匹配类似于HTML标签的东西,如 “Bold”。这就推动了模式的两个部分匹配完全相同的字符串,在这个例子中是’B’。

让我们再举一个例子:

/^ab*bc*d/

上面的regexp可以理解为:

1.从字符串的开头开始

2.匹配一个’a’。

3.尽可能多地匹配’b’,但不匹配任何一个也行。

4.尽可能多地匹配’c’,但不匹配任何一个也行。

5.尽可能多地匹配’d’,但不匹配任何一个也可以。

与’abbbccdddd’相匹配。

Perl  正则表达式中的回溯操作
这里我们可以看到我们正在回溯到第3步,因为步骤4是不可行的,所以我们回溯并找到最好的解决方案,继续进入步骤4。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程