1

非常感谢您花时间阅读本文。我对 Perl 还是很陌生,所以非常感谢任何帮助!

我正在尝试使用正则表达式从大量大型文档中提取一段文本。

我有一个正则表达式,我用它来识别我想要开始提取的较大文档中的哪个位置。这个正则表达式的条件是经常有多个匹配正则表达式的实例。我能够确定哪些匹配项是我要提取的文本正文的开头。(在下面的示例中,这将是 $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);

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

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

4

1 回答 1

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 模式的第 n 次出现(在 中指定的数字$pos),然后开始保存,$1直到遇到 $END 中的模式。如果您真的需要性能,我建议您查看\G断言,该断言将与您之前匹配的位置相匹配。这可以与内置的子程序混合使用pos。防止“回溯”也可以提高性能,但这是一个我不太了解的高级主题。

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

(另一种可能是将您的输入拆分为更小的字符串,但在许多情况下,最简单的 Perl 解决方案也是最好的。)

于 2012-07-12T21:20:21.677 回答