Perl 正则表达式中的回溯操作
在Perl中,正则表达式(又称regexes或regexps或REs)是一种描述一组字符串的方法,而不必在你的程序中列出所有的字符串,或者我们可以简单地说,它是一个用于模式匹配的字符序列。在Perl中,正则表达式有不同的用途。
- 首先,它们被用于条件式中,以确定一个字符串是否与一个特定的模式相匹配。
例子:正则表达式在条件式中的使用。
输出:
在这里,用户提供的输入被匹配,如果我们有一个词 “饿”,也就是说,如果条件为真,它将打印 “你会有什么?”否则,它将跳到下一个条件或一个语句。
- 其次,它们可以在一个字符串中定位模式,并可以用其他东西替换它们。
例子:替换运算符
输出:
在上述代码中,用 “好 “代替了 “最差”。
- 最后,模式不仅可以指定某些东西在哪里,也可以指定它不在哪里。所以split操作符使用正则表达式来指定数据不在哪里。也就是说,正则表达式定义了划分数据字段的分隔符。
示例:拆分运算符
输出:
在这里,在上面的例子中,分割函数在单个逗号字符上匹配。
回溯
正则表达式匹配的另一个重要特征是回溯,目前所有的正则非占有式表达式量词(用于计算所有匹配的总数,而不是默认的只匹配一次),即 *
、*?
、+
、+?
、{n, m}
和{n, m}
,都使用了回溯(需要时)。回溯通常在内部进行优化,但这里概述的一般原则是有效的(它是从一棵可能的树上的不成功的递归中返回)。
例如: /.*?/
可能被用来匹配类似于HTML标签的东西,如 “Bold”。这就推动了模式的两个部分匹配完全相同的字符串,在这个例子中是’B’。
让我们再举一个例子:
上面的regexp可以理解为:
1.从字符串的开头开始
2.匹配一个’a’。
3.尽可能多地匹配’b’,但不匹配任何一个也行。
4.尽可能多地匹配’c’,但不匹配任何一个也行。
5.尽可能多地匹配’d’,但不匹配任何一个也可以。
与’abbbccdddd’相匹配。
这里我们可以看到我们正在回溯到第3步,因为步骤4是不可行的,所以我们回溯并找到最好的解决方案,继续进入步骤4。