📜  珀尔 |正则表达式中的回溯

📅  最后修改于: 2022-05-13 01:55:15.730000             🧑  作者: Mango

珀尔 |正则表达式中的回溯

在 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";
        my $ip = <>;
        print($ip);
    }
    

    输出:

    在这里,匹配用户提供的输入,如果我们有一个单词“hungry”,即如果条件为真,它将打印“What would you have?”否则它将跳转到下一个条件或语句

  • 其次,他们可以在字符串中定位模式,并可以用其他东西替换它们。
    示例:替换运算符
    #!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 ("\n$stmt");
    

    输出:

    在上面的代码中,用“good”替换了“worst”。

  • 最后,模式不仅可以指定某物在哪里,还可以指定它不在哪里。因此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);  
    

    输出:

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

回溯

正则表达式匹配的另一个重要特性是回溯,目前所有正则非占有性表达式量词都使用(在需要时)(用于统计所有匹配的总数,而不是默认匹配一次),即“*”, *?、“+”、+?、{n, m} 和 {n, m}?。回溯通常在内部进行优化,但这里概述的一般原则是有效的(它是从可能性树上的不成功递归中返回的)。当 Perl 尝试用正则表达式匹配模式时,它会回溯,并且它早期的尝试没有成功,或者我们可以简单地说回溯意味着存储匹配的模式以供将来使用。
例如: /.*?/ 可能用于匹配类似于“ Bold ”之类的 HTML 标签的内容。这会推动模式的两个部分匹配完全相同的字符串,在本例中为“B”。

让我们再举一个例子,

/^ab*bc*d/

上面的正则表达式可以读作:
1.从字符串的开头开始
2. 匹配一个'a'。
3. 匹配尽可能多的'b',但不匹配任何一个都可以。
4. 匹配尽可能多的'c',但不匹配任何一个都可以。
5. 匹配尽可能多的 'd's,但不匹配任何一个都可以。
匹配 'abbbccdddd'。

在这里我们可以看到我们正在回溯到第 3 步,因为第 4 步不可行,所以我们回溯并找到进入第 4 步的最佳解决方案。