1

その後、長い文字列の2つのパス間のテキストスニペットを抽出したいと思います。

したがって、私は次のようなものを使用します。

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

`\".:\\(.*?)"前のパスです。また、2つのパスの間の部分は任意の文字にすることができるため、次のパスの先頭で正規表現を終了します。\".:\\

残念ながら、このようにコードは常に1つの一致をスキップします。これは、後続の検索が最後の検索の後に開始されるため、次の検索\".:\\のみが検出されるためだと思います。

検索の位置ポインターが正規表現の最後の部分の前(:の前\".:\\)に戻されていることを確認するにはどうすればよいですか?

編集:

"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で2つの結果を与えるはずです。

1.1。

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

"Hallo Peter"

@@@ "tool kit" @@@"

2.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 に答える