1

フォルダ内に.logや_logなどのファイルを取得しています。/*.log$/で.logファイルを選択できますが、_logであるファイルを見つけることができません。

指定されたフォルダから両方のタイプのファイルを取得する正規表現パターンが必要です。

4

3 に答える 3

3

あなたの質問には「perl」と「linux」の両方のタグが付けられています。ここでは、Perlスタイルの正規表現について話していると仮定します。これは、サンプルスニペットに表示されているもののように見えるためです。

*.シーケンスは間違いです。

一致させたいものに焦点を当てましょう。ドットで終わり、その後にリテラル文字「log」が続く任意のファイル名に一致させる必要があります。また、アンダースコアで終わり、その後にリテラル文字「log」が続くファイル名と一致させる必要があります。最後のドットまたはアンダースコアの前に来る可能性のある「何でも」を気にする必要はありません。したがって、正規表現はおそらく次のように記述したほうがよいでしょう。

/[._]log$/

ドットスターさえ気にしないことに注意してください。この状況では役に立ちません。

パターンを、リテラル文字「log」の後に整数シーケンスがオプションで続く可能性のあるファイルにも一致させたい場合(質問には記載されていませんが、フォローアップコメントの1つで説明されています)、次のように記述できます。

/[._]log\d*$/

ここで「星」役立ちます。'g'と文字列の終わりの間に0桁以上の数字を挟むことができます。

于 2012-06-12T10:03:50.923 に答える
1

私はDavidOのソリューションに(賛成することで)完全に同意しますが、通常、glob()を使用して特定のディレクトリからファイルのリストを取得する方が理にかなっており、読みやすさが向上します。

my $dir = "/path/here";

my @log_files = grep { /[\._]log\d*$/ } glob("$dir/*");

print join "\n", @log_files;

これはキャッチします

foo.log
foo_log
foo.log1
foo_log22
于 2012-06-12T10:32:50.067 に答える
-1

正規表現を使用し/.*[._]log$/ます。

私はあなたの最初のケースがうまくいったことに驚いています-/*.log$/それは合法的な正規表現ではありません(それがゼロ以上に一致することになっているもの*を言っていないので)。現在の結果を再確認してください。

于 2012-06-12T09:51:56.953 に答える