2012-07-12 37 views
1

非常感谢您花时间阅读此内容。我对Perl仍然很陌生,所以任何帮助表示赞赏!提取正则表达式匹配中的第N个子组

我想用一个正则表达式从一大组大文档中提取一段文本。

我有一个正则表达式,我用它来识别我想要开始提取的较大文档中的哪个位置。这个正则表达式的条件是经常有多个匹配正则表达式的实例。我能够识别哪些匹配是我想要提取的文本主体的开始。 (在下面的示例中,这将是$ finds [2]。

我想要做的是再次运行相同的正则表达式,添加一个。*?$ END以提取文本,其中$ END标识。结束,但我需要的是一种方式来告诉正则表达式开始在$ STAR的第N次出现提取

考虑这个:

my $sentence = 'A1Z blah blah A2Z blah blah A3Z blah A4Z END A5Z'; 
my @finds = $sentence =~ m/(A\dZ)/mg; 

#################### 
## Code that determine the element of @finds that 
## contains the match to the extraction I want. 
## For this question assume it is the third match (A3Z), 
## Element index number 2. 
#################### 

$START = 2; 

这里是我的尝试:

my @finds2 = ($sentence =~ m/((A\dZ){$START}.*?(END))/mg); 

my @finds2 = ($sentence =~ m/((A\dZ)[$START].*?(END))/mg); 

如果向PERL指示的{$ START}或[$ START]等到它具有“$ START”匹配,才开始提取并继续匹配,那么我希望它。

我知道我的尝试是不正确的。希望他们帮助指出我正在尝试做什么。

回答

3

这是做你喜欢的事吗?

my $pos = 3 
my $END = "END"; 
my $a = "A1Z blah blah A2Z blah blah A3Z blah A4Z END A5Z"; 
$a =~/(?:.*?A\dZ){$pos} (.*?) $END /x; 
print $1, "\n" if defined $1;' 
# prints " blah A4Z " 

此代码将寻找A \ DZ模式(在$pos指定数量)的n次发生和直到遇到在$ END模式启动后保存到$1。如果你确实需要性能,我会建议看看\G断言,这将匹配你以前的比赛离开的地方。这可以与内置的soubroutine pos混合使用。防止“回溯”也可以提高性能,但这是一个我不太了解的高级主题。

推荐读物:“perlop - Regexp Quote-Like Operators”,“perlre - Assertions”和“perldoc -f pos”。

(另一种可能性可能会区分你的投入较小的字符串,但在许多情况下,最简单的Perl的解决方案也是最好的。)

+0

+1很好的回答。 – sln 2012-07-13 01:12:27

相关问题