3

私は以下のような文字列を持っています:

$str = "/dir1/dir2/dir3/file.txt"

この文字列から/file.txtを削除したいと思います。

$strがになるように。

$str = "/dir1/dir2/dir3"

次の正規表現を使用しています。しかし、それはすべてを置き換えています。

$str =~ s/\/.*\.txt//;

最初ではなく最後の「/」を検索するように正規表現を作成するにはどうすればよいですか。

これの正しい正規表現は何ですか?

file.txtは固定名ではないことに注意してください。file1.txtfile2.txtなどのようになります。

4

3 に答える 3

6

その文字列からパスを取得する場合は、 File::Basenameを使用できます。Perlバージョン5以降のコアモジュールです。

perl -MFile::Basename -le '$str = "/dir2/dir3/file.txt"; print dirname($str);'

スクリプト形式:

use strict;
use warnings; # always use these
use File::Basename;

my $str = "/dir1/dir2/dir3/file.txt"; 
print dirname($str);"

正規表現は固定されておらず、貪欲であるため機能しません。そのため、最初に遭遇した.*スラッシュから始めて、可能な限り一致します。/動作する正規表現は次のようになります。

$str =~ s#/[^/]*?\.txt$##;

*?可能な限り最小の文字列に一致する、欲張りでない数量詞の使用に注意してください。また、「傾いた楊歯症候群」を回避するために、置換に別の区切り文字を使用していることにも注意してくださいs/\/\/\///

于 2012-06-24T13:08:18.487 に答える
3

非常に単純な正規表現:s/\/[^\/]*$//

于 2012-06-24T13:06:37.933 に答える
2

この正規表現では

m/(.*)\/[^\/]*$/

最初のサブマッチはあなたが探しているパスです。

編集:

あなたが代用を探しているならuser1215106の魂は行く方法です:

s/\/[^\/]*$//
于 2012-06-24T13:10:52.897 に答える