首页 > 解决方案 > 如何映射多行(每行使用 perl 具有相同的格式

问题描述

我试图使用 perl 映射每一行内容,并且每一行都有相同的格式。

我已经成功地映射了第一行,但是一旦我在正则表达式之后添加 $,一切都会出错。但是,如果我删除 $,则 reguar 表达式只能匹配第一行而忽略其余部分

这里是内容

$bar ="0 qid:85 1:0.666667 2:0.666666 3:0.857143 #docid = 579
0 qid:85 1:0.666667 2:0.666666 3:0.857143 #docid = 579";

m/^([0-2])[\s]qid\:(\d+).*?\#docid[\s]=[\s](\d+)+$/

标签: regexperl

解决方案


  • 您需要/m更改定义^$满足您的需求。
    • ^通常只匹配字符串的开头。与/m, 它也在换行后匹配。
    • $通常仅在字符串末尾和字符串末尾的换行处匹配。使用/m,它也匹配任何换行符。
  • 您需要/g获取所有匹配项(而不仅仅是第一个匹配项)。
  • [\s]是奇怪的写作方式\s
  • (\d+)+(最后)应该是(\d+)
  • 我在模式中添加了空格以提高可读性,这可以使用/x.

固定的:

while ( $bar =~ /^([0-2]) \s qid:(\d+) \s .*? \s \#docid \s = \s (\d+)$/mgx ) {
   my ($foo, $qid, $docid) = ($1, $2, $3);
   ...
}

推荐阅读