【问题标题】:Matched elements using regex in Perl在 Perl 中使用正则表达式匹配元素
【发布时间】:2009-04-08 08:29:55
【问题描述】:

我有一个包含正则表达式的哈希:要在其中捕获的匹配数和变量及其匹配位置。例如:

my %hash = (
    reg_ex => 'Variable1:\s+(.*?)\s+\n\s+Variable2:\s+(.*?)\s+\n',
    count => 2,
    Variable1 => 1,
    Variable2  => 2,
);

我将在代码的其他部分使用这个正则表达式,我将在其中给出$to_be_matched_variable =~ /$hash{reg_ex}/,我们在$1$2、...中获得所需的匹配项。

我需要使用Variable1这个键的值,它表示在我们通常使用$1的地方要使用的匹配数。

我尝试提供$.$hash{Variable1}$,$hash{Variable1}。我无法找到如何构建与$1$2 等价的内容...

【问题讨论】:

  • 这听起来像是您的架构有其他问题。你想完成什么任务?
  • 我建议使用 reg_ex => qr/.../,这样整个事情就更清楚了(IMO)

标签: regex perl


【解决方案1】:

试试:

(my @ArrayOfMatches) = $to_be_matched_variable =~ /$hash{reg_ex}/;

my $Variable1 = $ArrayOfMatches[$hash{Variable1}];

【讨论】:

  • AFAIK,这不起作用 - 全局匹配返回字符串中所有括号的所有匹配。如果没有 /g,它将根据 OP 的需要返回 ($1, $2, ...)。
  • 是的,哎呀!我也知道。我总是出于习惯输入 g,后来发现这不是我想要的!
【解决方案2】:

由于您已经在使用哈希,您不妨使用将名称映射到匹配项的内置 %+。因此,如果您将正则表达式更改为命名匹配,您可以轻松地使用%+ 来检索匹配的部分。

$reg_ex = 'Variable1:\s+(?<foo>.*?)\s+\n\s+Variable2:\s+(?<bar>.*?)\s+\n';

成功匹配后,%+ 应该有键 foobar 并且值将对应于匹配的内容。

因此,您的原始哈希可以更改为如下内容:

my %hash = (
    reg_ex => 'Variable1:\s+(?<foo>.*?)\s+\n\s+Variable2:\s+(?<bar>.*?)\s+\n',
    groups => [ 'foo', 'bar' ],
);

【讨论】:

  • 如果您可以使用 Perl 5.10,命名捕获是可行的方法。 Learning Perl 中有一个关于它们的捕获。 :)
【解决方案3】:

($1, $2, $3, ...., $9)[$hash{Variable1}]

【讨论】:

  • 哇!多么含蓄! Perl 多么好 ;)
  • 是的,不像 MyFineArrayOfMatchesWhereIStoreMyMatchesYouKnow。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
相关资源
最近更新 更多