当输入字符串包含换行符时,为什么匹配regex $会返回1?

时间:2016-08-29 11:42:50

标签: perl

为什么命令

perl -e "print qq/a\n/ =~ /$/"

打印1

据我所知,Perl将$视为\n之前的位置以及多线模式中整个字符串末尾的位置,这是默认值(否)应用修饰符。

3 个答案:

答案 0 :(得分:4)

它会打印1因为匹配。像m//这样的普通模式匹配在第一次匹配后停止,并返回1,因为它是真正的值。

根据该解释,如果它与"a\n"a\n字符后的1相匹配,则无关紧要。在任何一种情况下,都有匹配,所以它是真的,而且由Compiling REx "$" Final program: 1: EOL (2) 2: END (0) anchored ""$ at 0 minlen 0 Matching REx "$" against "a%n" 1 <a> <%n> | 1:EOL(2) 1 <a> <%n> | 2:END(0) Match successful! Freeing REx: "$" 代表。

您可以使用use re 'debug'深入了解。

{{1}}

这就是它的全部内容。

答案 1 :(得分:2)

匹配运算符返回1作为真值,因为模式匹配。 print输出值。

$是一个锚,它是一种特定的零宽度断言。它匹配模式中的条件但不消耗任何文本。由于模式中没有其他内容,/$/匹配包含空字符串的任何目标字符串。它总会回归真实。

perlre中所述,$是行尾锚点。 $允许最后的残余换行符,因此这两者都可以匹配:

"a"   =~ /a$/
"a\n" =~ /a$/

如果没有/m正则表达式修饰符,则行的结尾是字符串的结尾。但是,使用该修饰符,它可以在字符串中的任何换行符之前匹配:

"a\n" =~ /a$b/m

即使您没有看到它附加到特定匹配运算符,您也可能会遇到此行为,因为人们可以设置默认匹配标记:

use re '/m'; # applies to all in lexical scope

Perl最佳实践的过度热心粉丝喜欢将三个模式更改命令设为默认值(通常不会审核它影响的每个正则表达式):

use re '/msx'

还有另一个锚点,即字符串结尾锚\Z,它还允许尾随换行符。如果您不想允许换行,可以使用小写\z表示字符串的绝对结尾。这些不受正则表达式标志的影响。

答案 2 :(得分:0)

以下命令的工作原理如下:

perl -e "print qq/a\n/ =~ /$/"
  1. print提供了一个列表上下文,
  2. 在列表上下文中,m//将返回&#34;(1)&#34;为了成功,如果模式中没有括号,
  3. $匹配字符串的结尾(或在字符串末尾的换行符之前)。