编程Perl开发者

列举Perl正则表达式的特点。有哪些修饰符,如何正确处理匹配结果?请给出使用正则表达式解析字符串的示例。

用 Hintsage AI 助手通过面试

答案

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查找所有匹配。结果——脚本只提取了第一个匹配项,而用户期待完整的数据列表。