【发布时间】:2011-10-09 12:16:33
【问题描述】:
我有一个包含多行的字符串。我需要提取两个字符串之间的文本。例如:
Start Here Some example
text covering a few
lines. End Here
我需要提取字符串Start Here Some example text covering a few lines.
我该怎么做?
【问题讨论】:
我有一个包含多行的字符串。我需要提取两个字符串之间的文本。例如:
Start Here Some example
text covering a few
lines. End Here
我需要提取字符串Start Here Some example text covering a few lines.
我该怎么做?
【问题讨论】:
使用/s 正则表达式修饰符来处理string as a single line:
/s 将字符串视为单行。即改“.”。匹配任何字符,甚至是换行符,通常它不会匹配。
$string =~ /(Start Here.*)End Here/s;
print $1;
这将捕获到最后一个 End Here,以防它在您的文本中出现多次。
如果这不是你想要的,那么你可以使用:
$string =~ /(Start Here.*?)End Here/s;
print $1;
这将在第一次出现 End Here 时停止匹配。
【讨论】:
.*?,您将限制自己一次匹配一场。
echo -e "test1\ntest2" > test && perl -ne 'print $_ if /test1.*test2/s' test 什么也不打印。
-n 标志的不同相关问题,主要在Perl command line multi-line replace 回答——(但如果不是,它应该是在一个新问题中提出)
echo -e "test1\ntest2\ntest3\ntest1\ntest2" > test && perl -0777 -ne 'print $1 if /(test1\ntest2)/' test 只给出一次“test1\ntest2”输出。使用^ 和$ 也是不可能的。我会看看我是否有时间报告适当的多行支持的功能请求,有点像 Emacs 正则表达式。
print $1 if /(Start Here.*?)End Here/s;
【讨论】:
将字符串视为单行的正确修饰符不是 (?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 断言错误:
断言失败消息:org.apache.jorphan.util.JMeterException:错误调用 bsh 方法:eval 源文件:内联评估:``import java.io.*; //将数据结果写入文件 outfile = "/Users/Dani . . . '' Token Parsing Error: Lexical error at line 12, column 380. Encountered: "\n" (10),
所以我的肯定有其他问题。无论如何,只是一个建议
【讨论】: