Perl正则表达式匹配字符串,包括换行符

时间:2016-06-04 06:07:49

标签: regex perl

我如何匹配这样的东西:

haha\nhphp\nhdhd\nlolo\n

我想在hahalolo之间提取,包括换行符,我使用下面的正则表达式但是失败了:

/haha(.*?)lolo/s

我期望提取的内容:

\nhphp\nhdhd\n

我尝试使用其他修饰符,例如//n//m,但它不起作用。

3 个答案:

答案 0 :(得分:4)

您的代码没有任何问题,您应该忽略其他不熟悉Perl的人的答案

作为//stackoverflow.com/questions/37629071,您的正则表达式与您的字符串匹配,您需要做的就是使用捕获变量$1

use strict;
use warnings 'all';

use Data::Dump;

my $s = "haha\nhphp\nhdhd\nlolo\n";

dd $1 if $s =~ /haha(.*?)lolo/s

输出

"\nhphp\nhdhd\n"

答案 1 :(得分:2)

您需要(?s)修饰符

$x="haha\nhphp\nhdhd\nlolo\n";
$x =~ s/(?s)haha\s*(.*?)\s*lolo/$1/;
print $x;

或lookahad和lookbehind

$x="haha\nhphp\nhdhd\nlolo\n";
$x =~ m/(?s)(?<=haha)\s*(.*?)(?=\s*lolo)/;
print $1;

注意: - (?s)是DOTALL修饰符。它允许使用.

来匹配换行符

修改

您也可以使用之前使用的内容(我没有注意它)。您只需要访问第一个捕获组,可以使用$1$2等来完成。

$x =~ s/haha\s*(.*?)\s*lolo/$1/s
               <--->
                $1

答案 2 :(得分:-1)

您的代码没有错。您只需要捕获$ 1并以某种方式打印它。

注意:期间&#39;。&#39;匹配任何字符,但&#34; \ n&#34;除非修饰符有效。可以在http://perldoc.perl.org/perlretut.html中阅读。

TMTOWTD:

#!/usr/bin/perl -w
# test.pl

use strict;

my $str = "haha\nhphp\nhdhd\nlolo\n";
print $1 if ($str =~ m/haha(.*?)lolo/s);

# output: 
# [~]$ ./test.pl
#
# hphp
# hdhd
# [~]$