表示されている文字列の主な特性は、最後のというフレーズが*log*
であることです。
その後、パターンを固定、もしそうなら.N
拡張子が
my ($name) = $string =~ /(\w+)log(?:\.[0-9]+)?$/;
オプションでありながら、私たちはどこか途中
my ($name) = $string =~ /(\w+)log\.[0-9]+$/;
でlog
と一致しません上記\w+
パターンを使用していますlog
の前のテキストをキャプチャします。しかし、そのテキストには、単語以外の文字(-
、.
など)が含まれていることもあります。その場合は、Abigail's answerで指摘されているように、最後の/
の後ろのすべてをキャプチャするのに[^/]+
を使用します。私はreadibilityを支援することができますどのようなスペースが内部に無視されたと}x
修飾子を、追加されたコメント
my ($name) = $string =~ m{ ([^/]+) log (?: \.[0-9]+)? $}x;
に質問につき、.N
オプション付き。
/
以外の区切り文字を使用して、/
をエスケープせずに使用できるようにしてから、m
が必須です。 [^...]
は、の無効化された文字クラスであり、任意の文字に一致します。が内部にリストされています。したがって、[^/]+log
は、log
の前に来る/
ではないすべての連続する文字と一致します。
非キャプチャグループ内の(?: ...)
グループパターンに、?
は、グループ全体に適用されますが、不必要にそれらを捕捉しないように。
(?:\.[0-9]+)?
パターンは、log.
(ドットなし)とlog5
のようなものを禁止するように具体的に書かれています。これらが許容されている場合でも、コードにタイプミスを修正単純\.?[0-9]*
更新 のように変更します。.N
オプションがない、*
「_ **ファイル**はXXXXlog.num_という名前ですが、あなたの例は_directory_、 '.../syslog.1/''を表示します(後続のスラッシュに注意してください)。そして、これは常に_名前/パスの最後のものですか? – zdim
@zdim混乱して申し訳ありません。私は、ファイルの名前(XXXXlog.num)が途中で最後のものであることを意味しました。 – Luke