【问题标题】:Extract text from a multiline string using Perl使用 Perl 从多行字符串中提取文本
【发布时间】: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.

我该怎么做?

【问题讨论】:

    标签: regex string perl


    【解决方案1】:

    使用/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 什么也不打印。
    • @Hi-Angel 这是一个关于使用-n 标志的不同相关问题,主要在Perl command line multi-line replace 回答——(但如果不是,它应该是在一个新问题中提出)
    • @user202729 感谢您消除困惑,我刚刚尝试过,对我有用。不过结果是:似乎 perl 的“将所有文本视为单行”界面的用处有限,因为它要么匹配整个文本,要么匹配一个组。例如:echo -e "test1\ntest2\ntest3\ntest1\ntest2" > test && perl -0777 -ne 'print $1 if /(test1\ntest2)/' test 只给出一次“test1\ntest2”输出。使用^$ 也是不可能的。我会看看我是否有时间报告适当的多行支持的功能请求,有点像 Emacs 正则表达式。
    【解决方案2】:
    print $1 if /(Start Here.*?)End Here/s;
    

    【讨论】:

      【解决方案3】:

      将字符串视为单行的正确修饰符不是 (?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),

      所以我的肯定有其他问题。无论如何,只是一个建议

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-29
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        相关资源
        最近更新 更多