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);
}
输出:
在这里,用户提供的输入被匹配,如果我们有一个词 “饿”,也就是说,如果条件为真,它将打印 “你会有什么?”否则,它将跳到下一个条件或一个语句。
- 其次,它们可以在一个字符串中定位模式,并可以用其他东西替换它们。
例子:替换运算符
#!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");
输出:
在上述代码中,用 “好 “代替了 “最差”。
- 最后,模式不仅可以指定某些东西在哪里,也可以指定它不在哪里。所以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}
,都使用了回溯(需要时)。回溯通常在内部进行优化,但这里概述的一般原则是有效的(它是从一棵可能的树上的不成功的递归中返回)。
例如: /.*?/
可能被用来匹配类似于HTML标签的东西,如 “Bold”。这就推动了模式的两个部分匹配完全相同的字符串,在这个例子中是’B’。
让我们再举一个例子:
/^ab*bc*d/
上面的regexp可以理解为:
1.从字符串的开头开始
2.匹配一个’a’。
3.尽可能多地匹配’b’,但不匹配任何一个也行。
4.尽可能多地匹配’c’,但不匹配任何一个也行。
5.尽可能多地匹配’d’,但不匹配任何一个也可以。
与’abbbccdddd’相匹配。
这里我们可以看到我们正在回溯到第3步,因为步骤4是不可行的,所以我们回溯并找到最好的解决方案,继续进入步骤4。