Perl是处理正则表达式最强大的语言之一。用于匹配的运算符是=~和!~。
正则表达式的修饰符:
i — 不区分大小写g — 全局搜索(所有匹配)m — 多行模式(^和$在每行上工作)s — 点(.)包括换行符示例:
my $text = "My email: max@mail.com and ann@ya.ru."; while ($text =~ /([\w.]+@[\w.]+)/g) { print "Email: $1 "; }
在这个示例中,循环提取字符串中的所有电子邮件。
匹配后,值被捕获到特殊变量$1、$2、...(按每个捕获组)。
如果正则表达式搜索失败,变量$1会保存什么?
答案:
$1在未成功匹配时不会更新——它保存最后一次成功匹配的值。这是一个潜在的错误来源!为了避免这种情况,在复杂条件下最好显式地清除$1、$2、...
故事
使用复杂正则表达式进行输入验证依赖于
$1的值。在一次未找到匹配字符串的匹配后,变量$1没有变化,处理了旧的错误电子邮件地址。
故事
程序员对修饰符搞错了。在大文本中应用
/abc/g,期望在多行模式下工作。结果模式没有找到带换行的所需字符串,实际上应该使用/abc/ms。
故事
在项目中忘记使用全局标志
/g查找所有匹配。结果——脚本只提取了第一个匹配项,而用户期待完整的数据列表。