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
相关产品推荐
相关产品推荐

