如何在任何行的开头(包括第一行)与Perl正则表达式匹配?

时间:2010-03-12 19:42:11

标签: regex perl

根据Perl documentation on regexes

  

默认情况下,“^”字符保证仅匹配字符串的开头...嵌入的换行符不会与“^”匹配...但是,您可能希望将字符串视为多字符串-line buffer,这样“^”将在字符串中的任何换行符之后匹配 ...您可以通过在模式匹配运算符上使用/ m修饰符来完成此操作。

“在任何换行符之后”部分意味着它只会在第2行和后续行的开头匹配。如果我想在任何行(第1个,第2个等)的开头匹配怎么办?

编辑:好的,这个文件似乎在开头就有BOM信息(3个字符),这就是搞砸我的东西。无论如何都可以让^匹配?

编辑:所以最终它可以工作(只要没有BOM),但现在似乎Perl文档是错误的,因为它说“在任何新行之后”

4 个答案:

答案 0 :(得分:3)

^ 匹配第一行与/m标志:

~:1932$ perl -e '$a="12\n23\n34";$a=~s/^/:/gm;print $a'
:12
:23
:34

要与BOM匹配,您需要将其包含在匹配中。

~:1939$ perl -e '$a="12\n23\n34";$a=~s/^(\d)/<\1>:/mg;print $a'
12
<2>:3
<3>:4
~:1940$ perl -e '$a="12\n23\n34";$a=~s/^(?:)?(\d)/<\1>:/mg;print $a'
<1>:2
<2>:3
<3>:4

答案 1 :(得分:3)

如果你想保留BOM,你可以使用/^(?:\xEF\xBB\xBF)?/mg正则表达式在行的开头匹配。

答案 2 :(得分:1)

从概念上讲,假设在字符串开头之前是换行符。因此,/ ^ a /将在字符串的开头找到一个字母'a'。

答案 3 :(得分:-1)

在文件的开头放一个空行,这很酷,并且避免让regex难以阅读。

是的,BOM。它可能出现在文件的开头,因此在文件的开头放一个空。 BOM 不会是\s,或者只能用肉眼看到。当BOM导致regex失败时,它会导致我的工作时间缩短。