用perl编写的以下正则表达式的含义

时间:2013-06-08 14:20:51

标签: perl

这是一段代码

while($l=~/(\\\s*)$/) {
    statements;
}

$l包含从文件中获取的一行文本,实际上此代码用于遍历文件中的行。

问题:

  1. 我不清楚while中的情况是怎样的。我认为它正在尝试匹配\的组,后跟行末端的一些空格,并且每当一行以\结尾时,循环应该停止,并且可能是一些空格。我不确定。

  2. 我遇到了陈述$a ~= s/^(.*$)/$1/。据我所知,^将在字符串的开头强制匹配,但在(.*$)中意味着匹配字符串末尾的所有字符。剂量意味着该语句试图找到最后一组字符是否与文本开头的字符组相同?

6 个答案:

答案 0 :(得分:2)

值得注意的是这句话:

while ( $l =~ /(\\\s*)$/ ) {

是一个无限循环,除非在循环内改变$l以使正则表达式不再匹配。正如其他人已经提到的那样,这就是它的匹配:

  • ( ... )一个捕获组,将字符串捕获到$1(这是第一个,而不是小写L)
  • \\匹配文字反斜杠
  • \s*匹配0个或更多空格字符。
  • $匹配行尾和可选换行符。

由于你没有/g修饰符,这个正则表达式不会迭代匹配,它只会检查是否有匹配,每次迭代重置正则表达式,从而导致无限循环。

声明

$a ~= s/^(.*$)/$1/

看起来毫无意义。它捕获一串字符直到字符串结尾,然后用它自己替换它。捕获的文本存储在$1中,只需替换即可。关于这个正则表达式唯一有用的是:

  • 它匹配到换行符\n,并且没有进一步,这可能对解析器有用。期间.匹配除换行符之外的任何字符,除非正则表达式中存在/s修饰符。
  • 它捕获$1中的行以供将来使用。但是,简单的/^(.*$)/也会这样做。

答案 1 :(得分:1)

<强> 1 即可。 while

通常while (regex)/g修饰符一起使用,否则,如果匹配,则会获得无限循环(除非您退出循环,例如使用last)。
语句将在无限循环中连续执行。

在您的情况下,添加g

while($l=~/(\\\s*)$/g) 

只有一个循环,由于$ - 使匹配唯一(任何匹配到字符串末尾的匹配都是唯一的,因为$标志着结束,......之后什么都没有。

<强> 2 即可。 $a ~= s/^(.*$)/$1/

这是替换。如果字符串^.*$匹配(并且它会,因为^.*$匹配(几乎,请参阅评论)任何内容)它将替换为... $1()内的内容,即它本身,因为匹配发生在第1个字符串到字符串

的末尾
  • ^表示字符串的开头
  • (.*)表示所有字符
  • $字符串结尾

因此会将$a替换为自身 - 可能不是您想要的。

答案 2 :(得分:0)

它匹配一个文字反斜杠,后跟0或更多空格,后跟行尾。

答案 3 :(得分:0)

它对该文本文件中包含statements的所有行执行\,后跟零行或多行(\s*),行末({{ 1}})。

答案 4 :(得分:0)

(\\\s*)$此正则表达式意味着--- \后跟零个或多个white space characters,后跟行尾。由于您在(...)中拥有正则表达式,因此如果需要,可以使用$1提取匹配的内容。

http://rubular.com/r/dtHtEPh5DX

编辑 - 基于您的更新

$a ~= s/^(.$)/$1/ ---这是search and replace。所以你的正则表达式匹配一行只包含一个字符(因为你使用. http://www.regular-expressions.info/dot.html),除了换行符。由于您使用(...),因此提取与正则表达式匹配的字符并将其存储在变量a

编辑 - 您更改了正则表达式,因此这里是更新后的答案

$a ~= s/^(.*$)/$1/ - 与上述相同,但现在匹配零个或多个字符(新行除外)

答案 5 :(得分:0)

它匹配以反斜杠字符结尾的行,忽略任何尾随的空白字符。

在某些语言和数据文件中使用带有反斜杠的行结束表示该行正在下一行继续。所以我怀疑这是合并这些延续线的解析器的一部分。

如果您在RegExr输入正则表达式并将鼠标悬停在各个部分上,则会在工具提示中显示每个部分的含义。