-1

私はいくつかのドキュメントから便利なコマンドを引き出すスクリプトに取り組んでいますが、オンラインで検索していくつかの例を試してみても、正規表現が正しく機能していないようです。入力ファイルはワード doc で、正常に機能している基本的なヘッダー情報と、複数行にまたがって複数回発生する可能性のある 2 セットの開始タグと終了タグの間のすべてのテキストを抽出する必要があります。以下は、ヘッダーの詳細を正しく引き出すが、一致していないように見えるコードと、ドキュメントを介したコマンドヘッダーのコードです。

open(DAT,'<input') or die "$!";
$file  = do{local $/; <DAT>};
close(DAT);
open (FH2, '>>', 'out.txt') or die "$!";
my @matches = $file =~ m/(\[$source\]|\[$target\]|\[admin\]|<IA%COMMAND>.*?       <\/IA%COMMAND>|<IA%UICOMMAND>.*?<\/IA%UICOMMAND>)/g;
print FH2 @matches;
close (DAT);
close (FH2);

入力ファイルは、次のような形式のワード doc です。

random overhead
[source]
<IA%COMMAND>stuff to print </IA%COMMAND>
stuff that should be ignored
[target]
<IA%UICOMMAND>other stuff to print</IA%UICOMMAND>
stuff to be ignored
[target]
<IA%COMMAND>print out this too
and this as well </IA%COMMAND>

出力は次のようになります。

[source]
<IA%COMMAND>stuff to print </IA%COMMAND>
[target]
<IA%UICOMMAND>other stuff to print</IA%UICOMMAND>
[target]
<IA%COMMAND>print out this too
and this as well </IA%COMMAND>

私はそれを分解して、うまく一致する開始タグと終了タグを検索するだけにしましたが、.* に満足していないようです? タグ間のコンテンツに対して貪欲でない一致を行う。アドバイスをいただければ幸いです。

4

2 に答える 2

0
s/(?:\A.*?(?=^\[[^[\]]*\](?:\n|\z)|\z)|(?<=[>\]]\n)(?!\[[^[\]]*\]*(?:\n|\z)|<[^>]*COMMAND>).*?(?=^\[[^[\]]*\](?:\n|\z)|^<[^>]*COMMAND>|\z))//gms;

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

于 2012-11-26T15:21:23.760 に答える
0

この正規表現を使用します(?<=<[^/]+?>)(.+?)(?=</.+?>)

于 2012-11-26T14:58:55.513 に答える