我如何匹配这样的东西:
haha\nhphp\nhdhd\nlolo\n
我想在haha
和lolo
之间提取,包括换行符,我使用下面的正则表达式但是失败了:
/haha(.*?)lolo/s
我期望提取的内容:
\nhphp\nhdhd\n
我尝试使用其他修饰符,例如//n
,//m
,但它不起作用。
答案 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
# [~]$