根据Perl documentation on regexes:
默认情况下,“^”字符保证仅匹配字符串的开头...嵌入的换行符不会与“^”匹配...但是,您可能希望将字符串视为多字符串-line buffer,这样“^”将在字符串中的任何换行符之后匹配 ...您可以通过在模式匹配运算符上使用/ m修饰符来完成此操作。
“在任何换行符之后”部分意味着它只会在第2行和后续行的开头匹配。如果我想在任何行(第1个,第2个等)的开头匹配怎么办?
编辑:好的,这个文件似乎在开头就有BOM信息(3个字符),这就是搞砸我的东西。无论如何都可以让^匹配?
编辑:所以最终它可以工作(只要没有BOM),但现在似乎Perl文档是错误的,因为它说“在任何新行之后”
答案 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
失败时,它会导致我的工作时间缩短。