我的情况可能会出现如下格式:
---id-H--
Header: data
Another Header: more data
Message: sdasdasdasd
Message: asdasdasdasd
Message: asdasdasd
可能有很多消息,或只是一对。我宁愿不必走出RegEx,因为我使用RegEx解析消息上方的一些头信息,消息和标题是我正在解析的文本的一部分。附加到文本中的消息可能很多。
我还想使用命名捕获组,所以像
Message: (?<Message[index of match]>.+)
匹配匹配的次数与填写索引的次数相同。在RegEx中是否存在这样的情况? (我最终将在Perl中使用它。)
答案 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
祝你好运。