RegEx - 索引/排列命名捕获组?

时间:2010-06-14 18:41:59

标签: regex perl parsing

我的情况可能会出现如下格式:

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

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

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

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

匹配匹配的次数与填写索引的次数相同。在RegEx中是否存在这样的情况? (我最终将在Perl中使用它。)

2 个答案:

答案 0 :(得分:3)

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

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

运行它给出:

On line 1, found these messages: sdasdasdasd, asdasdasdasd, asdasdasd  
On line 2, found these messages: more message, another message, YAM  

答案 1 :(得分:2)

Perl命名捕获缓冲区语法,其中(?<name>...)实际上是/(pattern1(pattern2))/的Perl语法的替代或替代使用,其中捕获缓冲区的潜在不明确性。

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

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

以下是样本:

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

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

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

祝你好运。