2010-06-14 56 views
3

我有一个情况可以的东西的格式显示如下:正则表达式 - 索引/阵列命名的捕获组?

​​

可能有很多的消息,或只是一对夫妇。我宁愿不必走出RegEx之外,因为我正在使用RegEx来解析消息上方的某些头信息,并且消息与头一起是我正在解析的文本的一部分。附在文本中的消息可能很多。

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

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

它匹配匹配多次,它可以被填充到索引中。难道这样的事情在正则表达式存在吗? (我最终会在Perl使用这个)

+1

你是什么意思的索引?电话号码? --- id-H--部分? – Oesor 2010-06-14 19:05:09

+0

我所指的索引既不是。它仅仅是匹配的索引,即匹配1 - 索引0(第一个“消息:”),匹配2 - 索引1(第二个“消息:”),... – 2010-06-14 20:14:00

回答

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 
+0

这是一个特殊的答案,一。我自己真的正在寻找像python m.groups()这样的提取所有匹配组的东西。 – 2011-05-16 19:21:11

+0

@Benoît:你应该查看perl 5.14 - 它支持命名捕获组 - http://perldoc.perl.org/perlre.html – Ether 2011-05-24 18:22:55

2

的Perl命名的捕获缓冲区语法(?<name>...)实际上是对/(pattern1(pattern2))/的Perl语法的替代或替代使用,其中捕获缓冲区可能是模糊的。

你可能拿到赛(?<name>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"; 

还有更多的方法,但那些2是常见的,Perly

好运。