Regex 正则表达式-索引/阵列命名捕获组?

Regex 正则表达式-索引/阵列命名捕获组?,regex,perl,parsing,Regex,Perl,Parsing,我遇到的情况是,某些内容可能以如下格式出现: ---id-H-- Header: data Another Header: more data Message: sdasdasdasd Message: asdasdasdasd Message: asdasdasd 可能有很多信息,或者只有几条。我不希望跳出RegEx,因为我使用RegEx解析消息上方的一些头信息,消息以及头是我解析的文本的一部分。文本中附加的消息可能很多 我还想使用命名的捕获组 Message: (?<Message[

我遇到的情况是,某些内容可能以如下格式出现:

---id-H--
Header: data
Another Header: more data
Message: sdasdasdasd
Message: asdasdasdasd
Message: asdasdasd
可能有很多信息,或者只有几条。我不希望跳出RegEx,因为我使用RegEx解析消息上方的一些头信息,消息以及头是我解析的文本的一部分。文本中附加的消息可能很多

我还想使用命名的捕获组

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

它将尽可能多地匹配匹配项,并填充索引。正则表达式中是否存在类似的内容?(我最终将在Perl中使用它。)

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

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
使用严格;
使用警告;
#使用两行作为“行”分隔符
本地$/=“\n\n”;
while(我的$line=)
{
我的($id)=($line=~/^--id-(\d+)--$/m);
我的@messages=($line=~/^Message:(.*)$/mg);
打印“在第$id行,找到以下消息:”,加入(“,”,@messages),“\n”;
}
__资料__
---id-1--
标题:数据
另一个标题:更多数据
讯息:sdasd
信息:asdasdasd
信息:asdasdasd
---id-2--
标题:数据2
另一个标题:东西
信息:更多信息
信息:另一条信息
留言:任志刚
跑步可以带来:

On line 1, found these messages: sdasdasdasd, asdasdasdasd, asdasdasd On line 2, found these messages: more message, another message, YAM 在第1行中,找到以下消息:sdasd、asdasdasd、asdasdasd 在第2行,找到以下消息:更多消息,另一条消息,YAM
Perl命名的capture buffer语法(其中有
(?…)
)实际上是对
/(pattern1(pattern2))/
的Perl语法的替代或替代使用,其中可能存在捕获缓冲区是哪个的模糊性

您可能会得到匹配的哈希形式
(?模式)
,然后参考
%+
%-
的特殊哈希值,请参阅以获取命名捕获缓冲区语法以及%+和%-和命名捕获的示例

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

以下是样本:

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

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


祝你好运。

你所说的指数是什么意思?电话号码?--id-H--section?我指的索引既不是。它只是匹配的索引,即匹配1-索引0(第一条“消息:”),匹配2-索引1(第二条“消息:”),…这是一个特别的答案,与真实答案相对应。我自己正在研究python m.groups()之类的东西,它可以提取匹配的所有组。@Benoît:您应该查看perl 5.14-它支持命名捕获组--
my @messages = ($text=~/^Message: (.*)/gm);
print "The first message is $messages[0]\n";