1

我想随后提取长字符串中两个路径之间的文本片段。

因此,我使用这样的东西:

while($data=~ m/\"(.:\\.*?)\".:\\/sg){...}

`\".:\\(.*?)是一条带"前的路径。而且,由于两条路径之间的部分可以是任何字符,因此我以下一条路径的开头结束正则表达式:\".:\\

不幸的是,代码总是跳过一个匹配项。我相信,这是因为后续搜索将在最后一个之后开始\".:\\,因此它只会找到下一个。

我如何确保搜索的位置指针设置回正则表达式的最后一部分之前(之前\".:\\:)

编辑:

"y:\car\main.cs@@jung" "Added format of version number to all sub-parts.

"Hallo Peter"

@@@ "tool kit" @@@"

"y:\car\main.cs@@kkla" (lkaskdn awdiwj)

"The filter "function of the new version works with Excel 2007"only,
but is the correct filter structure.

@@@ "Huihu boy" @@@"

这个文件应该在 $1 中给我两个结果:

1.

y:\car\main.cs@@jung" "Added format of version number to all sub-parts.

"Hallo Peter"

@@@ "tool kit" @@@"

2.

y:\car\main.cs@@kkla" (lkaskdn awdiwj)

"The filter "function of the new version works with Excel 2007"only,
but is the correct filter structure.

@@@ "Huihu boy" @@@"

但它只会给我第一个。

4

1 回答 1

2

你想要的是一个前瞻断言。这匹配了你的模式之后的一些东西,而不包括你的匹配中的“东西”。语法是:

(?=...)

我没有您的正则表达式的示例数据,所以这里是一个简单的示例:

use strict;
use warnings;

my $string = "foobarbarbarnbar";

print "Regular matches: ";
#regular matching
while ($string =~ /(\w+?)bar/g)
{
   print " $1"; 
}
#lookahead
print "\nLookahead matches: ";
while ($string =~ /(\w+?)(?=bar)/g)
{
   print " $1"; 
}

输出:

Regular matches:  foo bar n 
Lookahead matches:  foo bar bar barn
于 2012-10-22T10:59:51.140 回答