【问题标题】:RegEx - Indexed/Arrayed Named Capture Groups?RegEx - 索引/排列命名捕获组?
【发布时间】:2011-03-03 16:00:00
【问题描述】:

我遇到的情况可能会以如下格式显示:

---id-H--
Header: data
Another Header: more data
Message: sdasdasdasd
Message: asdasdasdasd
Message: asdasdasd

可能有很多消息,或者只有几个。我宁愿不必走出 RegEx,因为我正在使用 RegEx 来解析消息上方的一些标头信息,并且带有标头的消息是我正在解析的文本的一部分。附加到文本中的消息可能很多。

我也想使用命名的捕获组,所以像

Message: (?<Message[index of match]>.+)

在填充索引的情况下尽可能多地匹配匹配项。RegEx 中是否存在类似的内容? (我最终会在 Perl 中使用它。)

【问题讨论】:

  • 索引是什么意思?电话号码? ---id-H- 部分?
  • 我指的索引都不是。它只是匹配的索引,即匹配 1 - 索引 0(第一个“消息:”),匹配 2 - 索引 1(第二个“消息:”),...

标签: regex perl parsing


【解决方案1】:

假设每个组由一个空行分隔,这可能会让你更接近:

use strict;
use warnings;

# use two lines as the "line" separator
local $/ = "\n\n";

while (my $line = <DATA>)
{
    my ($id) = ($line =~ /^---id-(\d+)--$/m);
    my @messages = ($line =~ /^Message: (.*)$/mg);

    print "On line $id, found these messages: ", join(', ', @messages), "\n";
}
__DATA__
---id-1--
Header: data
Another Header: more data
Message: sdasdasdasd
Message: asdasdasdasd
Message: asdasdasd

---id-2--
Header: data2
Another Header: stuff
Message: more message
Message: another message
Message: YAM

运行,给出:

在第 1 行,找到这些消息:sdasdasdasd、asdasdasdasd、asdasdasd 在第 2 行,找到这些消息:更多消息,另一个消息,YAM

【讨论】:

  • 这是一个临时的答案,对一个真实的答案。我自己真的在研究类似 python m.groups() 的东西,它可以提取匹配的所有组。
  • @Benoît:你应该看看 perl 5.14——它支持命名的捕获组——perldoc.perl.org/perlre.html
【解决方案2】:

您拥有(?&lt;name&gt;...) 的Perl 命名捕获缓冲区语法实际上是/(pattern1(pattern2))/ 的Perl 语法的替代或替代用法,其中捕获缓冲区是哪个的潜在歧义。

您可能会获得匹配 (?&lt;name&gt;pattern) 的散列形式,然后引用 %+%- 的特殊散列值,请参阅 perlre 以了解命名的捕获缓冲区语法和 perlvar 以获取示例%+ 和 %- 以及命名的捕获。

然而,Perl 中有更简单的解决方案。您可以进行返回列表的全局匹配,然后对列表进行操作。您将所有内容匹配到一个数组中。

这里是示例:

foreach my $message ($text=~/^Message: (.*)/gm) {
   # Process messages...
}

my @messages = ($text=~/^Message: (.*)/gm);
print "The first message is $messages[0]\n";

还有很多方法,但这两种方法很常见,Perly

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 2022-01-12
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    相关资源
    最近更新 更多