使用Perl从多行字符串中提取文本

时间:2011-07-20 15:22:55

标签: regex string perl

我有一个涵盖多行的字符串。我需要在两个字符串之间提取文本。例如:

Start Here Some example
text covering a few
lines. End Here

我需要提取字符串Start Here Some example text covering a few lines.

我该怎么做?

3 个答案:

答案 0 :(得分:25)

使用/s正则表达式修饰符来处理string as a single line

  

/ s的   将字符串视为单行。也就是说,改变“。”匹配任何字符,甚至是换行符,通常它不匹配。

  $string =~ /(Start Here.*)End Here/s;
  print $1;

这将捕获 last End Here,以防它在您的文字中出现多次。

如果这不是您想要的,那么您可以使用:

  $string =~ /(Start Here.*?)End Here/s;
  print $1;

这将在第一次出现End Here时停止匹配。

答案 1 :(得分:9)

print $1 if /(Start Here.*?)End Here/s;

答案 2 :(得分:1)

将字符串视为单行的正确修饰符不是(?s)而不是(/ s)?我已经在类似的问题上挣扎了很长一段时间,嵌入在JMeter的View Results Tree监听器中的RegExp Tester用正则表达式显示我的正则表达式提取器

(?s)<FMSFlightPlan>(.*?)</FMSFlightPlan>

匹配

<FMSFlightPlan>
C87D
AN NTEST/GL 
- FPN/FN/RP:DA:GCRR:AA:EIKN:F:SAMAR,N30540W014249.UN873. 
BAROK,N35580W010014..PESUL,N40529W008069..RELVA,N41512W008359.. 
SIVIR,N46000W008450..EMPER,N49000W009000..CON,N53545W008492 
</FMSFlightPlan>

而正则表达式

(?s)<FMSFlightPlan>(.*?)</FMSFlightPlan>

不匹配。其他正则表达式测试者显示相同的结果。但是,当我尝试执行脚本时,我收到了Beanshell Assertion错误:

  

断言失败消息:org.apache.jorphan.util.JMeterException:调用bsh方法时出错:eval源文件:内联评估:``import java.io. *; //将数据结果写出到文件outfile =“/ Users / Dani ...”'令牌解析错误:第12行第380行的词汇错误。遇到:“\ n”(10),

所以别的东西绝对是我的错。无论如何,只是一个建议