You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl正则表达式问题:如何提取文本中的Scenario代码块

Perl正则提取Scenario代码块问题解决

问题概述

我需要从文本中提取完整的Scenario代码块,在正则测试网站上验证过的表达式有效,但放到Perl逐行读取的代码里就失效了,求修复方案。

输入文本

#
  #------------------------------------------- spaceholder ---------------------------------------------------------------------------
  #

  #@E2E-1 @id:1 
  Scenario: Login & Search: B2B_PKG_IN >> BE
    Given I am on the login page
    When I enter <username> and incorrect password multiple times
    Then I should be locked out of my account
    And I should see a lockout message



  #@E2E-2 @id:32 
  Scenario: Login & Search: B2B_PKG_IN >> NL
    Given I am on the login page
    When I enter <username> and incorrect password multiple times
    Then I should be locked out of my account
    And I should see a lockout message


  #
  #------------------------------------------- B2B_PKG_3PA ---------------------------------------------------------------------------


  #

  @E2E-3 @id:3
  Scenario: Login & Search: B2B_PKG_3PA >> BE
    Given I am on the login page
    When I enter <username> and incorrect password multiple times
    Then I should be locked out of my account
    And I should see a lockout message

期望输出

#@E2E-1 @id:1 
  Scenario: Login & Search: B2B_PKG_IN >> BE
    Given I am on the login page
    When I enter <username> and incorrect password multiple times
    Then I should be locked out of my account
    And I should see a lockout message



  #@E2E-2 @id:32 
  Scenario: Login & Search: B2B_PKG_IN >> NL
    Given I am on the login page
    When I enter <username> and incorrect password multiple times
    Then I should be locked out of my account
    And I should see a lockout message



  @E2E-3 @id:3
  Scenario: Login & Search: B2B_PKG_3PA >> BE
    Given I am on the login page
    When I enter <username> and incorrect password multiple times
    Then I should be locked out of my account
    And I should see a lockout message

测试通过的正则表达式

((@[^\n]+|#@[^\n]+)?\s*)?Scenario:[^\n]*\n(?:[^\n]*\n)*?\n 

失效的Perl代码

while (my $block = <$initial_fh>) {
        push @scenarios, $block if ($block =~ /$pattern/);
    }

问题原因与解决方案

核心问题

你的Perl代码是逐行读取文件的(while(<$initial_fh>)每次只获取一行文本),但你的正则表达式是用来匹配多行的Scenario块(从标签行到下一个空行的完整内容),单行根本无法满足匹配条件,所以自然提取不到任何内容。

修复方案

需要把整个文件内容一次性读入内存,再用全局匹配来提取所有符合条件的块,代码示例如下:

# 打开目标文件,替换为你的实际文件路径
open my $initial_fh, '<', 'your_scenario_file.txt' or die $!;

# 一次性读取整个文件内容
local $/; # 取消输入记录分隔符,让<>读取全部内容
my $full_content = <$initial_fh>;
close $initial_fh;

my @scenarios;
# 定义正则模式,去掉末尾多余空格避免匹配无效空白
my $pattern = qr/((@[^\n]+|#@[^\n]+)?\s*)?Scenario:[^\n]*\n(?:[^\n]*\n)*?\n/;

# 全局匹配所有符合条件的Scenario块
while ($full_content =~ /$pattern/g) {
    push @scenarios, $&;
}

# 输出提取结果验证
print join('', @scenarios);

额外优化建议

如果你的Scenario块始终以连续空行作为分隔,当前正则可以正常工作;如果后续分隔规则有变化,可以调整(?:[^\n]*\n)*?\n部分来适配新的分隔逻辑。

内容的提问来源于stack exchange,提问作者PopSmoke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:23:13