1

特定の繰り返しテキストブロックが設定されています。それらには動的なファイル名と動的なメッセージがあります。すべてのファイル名について、メッセージを抽出したいと思います。

Filename: dynamicFile.txt
Property: some property to neglect
Message: the message I want
Time: dynamicTime

メッセージの後の部分を抽出したいのですが、これは次のようになりますthe message I want

私が持っているもの:以下は、ファイル名と時間の間のすべてに一致します。

(?<=Filename: %myFileVar%)(?s)(.*)(?=Time:)

一方%myFileVar%、動的ファイル変数は、式にフィードします。

次に、ファイル名の後からメッセージ部分までを省略する方法を見つける必要があります。ここで私は省略しなければならないでしょう:

Property: some property to neglect
Message: 

これはどのように行うことができますか?

4

3 に答える 3

2
use warnings;
use strict;

my $text;
{
    local $/;
    $text = <DATA>;
}

my $myFileVar = 'dynamicFile.txt';

if ($text =~ /Filename: \Q$myFileVar\E.*?Message: (.*?)\s*Time:/s)
{
   print $1;    
}

__DATA__
Filename: dynamicFile.txt
Property: some property to neglect
Message: the message I want
Time: dynamicTime

Time:注:これは、常にメッセージ行の直後に来ることを前提としています。それが当てはまらない場合、池上通信機のソリューションは他の行をスキップする方法を提供します。

説明:

  • パターンに変数を挿入するだけで、補間されます。
  • ただし、変数に特別な正規表現文字が含まれている場合、それらは正規表現文字として扱われます。したがって、変数をで囲む必要があります\Q...\E。これにより、その間のすべてが文字通り処理されます。そうしないと、ファイル名のドットはどの文字とも一致します。
  • 文字列の一部のみをキャプチャするためにルックアラウンドを使用する必要はありません。$1代わりに、キャプチャグループを使用してください。パターン内の通常の括弧のセットは、変数、$2などに自動的に挿入されます。
  • このような単純なケースではs、パターンの後のスイッチとしてシングルラインモード()を有効にすることをお勧めします。(/sの代わりに(?s))。パターン内でオンにするのは実験的なものであり、パターンの一部にのみ適用する必要がある場合にのみ使用してください。
  • .*?の代わりに使用する必要があり.*ます。それ以外の場合、パターンはファイルの最初Message:から最後まですべてに一致Time:します。
于 2013-02-20T10:05:28.720 に答える
1
/
   ^
   Filename: \s* \Q$myFileVar\E \n
   (?: (?!Message:) [^\n]*\n )*
   Message: \s* ([^\n]*) \n
   (?: (?!Time:) [^\n]*\n )*
   Time:
/mx

(?: [^\n]*\n )*任意の数の行をスキップします。

于 2013-02-20T10:07:40.387 に答える
0

Perlは\KMagicを実行できます

私のお気に入りの解決策が見当たらないため、遅い回答を追加します。Perl正規表現で、\Kこれまでに一致したすべてのものを最終一致から削除するようにエンジンに指示します。したがって、この正規表現を使用できたはずです。

(?sm)^Filename:.*?Message: \K[^\r\n]+

あるいは:

(?m)^Message: \K[^\r\n]+

デモを参照してください。

于 2014-06-27T11:37:24.360 に答える