如何映射多行(使用perl,每行具有相同的格式

时间:2019-04-01 05:19:15

标签: regex 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+)+$/

1 个答案:

答案 0 :(得分:1)

  • 您需要/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);
   ...
}