gpt4 book ai didi

regex - 使用正则表达式搜索 Perl 数组并仅返回单个捕获组

转载 作者:行者123 更新时间:2023-12-04 16:36:25 24 4
gpt4 key购买 nike

我有一个 Perl 脚本,我在其中循环执行 Web 服务调用。服务器返回一个多值 HTTP header ,我需要在每次调用后解析该 header ,其中包含我将需要进行下一次调用的信息(如果它不返回 header ,我想退出循环)。

我只关心 header 中的一个值,我需要使用正则表达式从中获取信息。假设 header 是这样的,我只关心“foo”值:

X-Header: test-abc12345; blah=foo
X-Header: test-fgasjhgakg; blah=bar

我可以像这样获取 header 值:@values = $response->header( 'X-Header' );。但是我如何快速检查是否

  1. 有一个 foo 值,并且
  2. 为下一次迭代解析并保存 foo 值?

理想情况下,我想做这样的事情:

my $value = 'default';

do {
# (do HTTP request; use $value)
@values = $response->header( 'X-Header' );
} while( $value = first { /(?:test-)([^;]+)(?:; blah=foo)/ } @values );

但是 grepfirst(来自 List::Util)等都返回整个匹配而不仅仅是我想要的单个捕获组。我想通过遍历数组并在循环体内匹配/解析来避免弄乱我的代码。

我想要的有可能吗?什么是最紧凑的编写方式?到目前为止,我所能想到的就是使用 lookarounds 和 \K 来丢弃我不关心的东西,但这不是 super 可读的并且使正则表达式引擎执行很多不必要的步骤。

最佳答案

所以看起来你想捕获具有特定模式的第一个元素,但只获取模式。你希望它做得很好。事实上,firstgrep 只传递元素本身。

然而,List::MoreUtils::first_result确实支持处理它的匹配

use List::MoreUtils 0.406 qw(first_result);

my @w = qw(a bit c dIT); # get first "it" case-insensitive

my $res = first_result { ( /(it)/i )[0] } @w;

say $res // 'undef'; #--> it

需要 ( ... )[0] 将正则表达式放入列表上下文中,以便它返回实际捕获。另一种方法是 firstres { my ($r) =/(it)/i; $r 。选择你的选择


对于题目中的数据

use warnings;
use strict;
use feature 'say';

use List::MoreUtils 0.406 qw(firstres);

my @data = (
'X-Header: test-abc12345; blah=foo',
'X-Header: test-fgasjhgakg; blah=bar'
);

if (my $r = firstres { ( /test-([^;]+);\s+blah=foo/ )[0] } @data) {
say $r
}

打印 abc12345,在评论中澄清为寻求的结果。


0.406(2015-03-03)之前的模块版本没有firstres(别名first_result)

关于regex - 使用正则表达式搜索 Perl 数组并仅返回单个捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69457822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com