珀尔 |正则表达式中的回溯
在 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 步的最佳解决方案。