2012-02-28 7 views
0

正規表現は使用できますが、正しい正規表現を見つけることはできません。これを行う組み込み関数もありますか?UNIXの絶対パスとどのように一致させ、それをperlで抽出するのですか?

+0

あなたが望むものをもう少し明確に説明できますか?まったく一致して抽出したいものは何ですか?あなたは一致させたい、そして一致させたくない、そしてあなたが後にしている出力の例をいくつか与えることができますか? –

+1

特別な制限はありませんが、そうすることはできません。最新の* nixパスには '\ 0'を除く任意の文字を含めることができます。意味は、あなたが望むならば、文のようなパスを持つことができます。あなたが本当に行くことができるのは、絶対パス名のための唯一のことです。 – cHao

+0

"bmake:/ bb/cc/xx/yy/zz/aa"で停止しました。/bb/cc/xx/yy/zz/aa –

答えて

2

bmake: stopped in /bb/cc/xx/yy/zz/aa 

この正規表現は、パス名を引きます:

m%\s(/.*)% 

それは何が続くスラッシュに続く空白文字を探します。あなたは、パス名に空白がない場合は、より制限を使用することができます。

m%\s(/\S*)% 

あなたは確信している場合は、必ず名前を一つ以上のパスコンポーネントがあるでしょう、あなたが追加することができますその他の制限:

m%\s(/\S+/\S*)% 

これが続きます。パス内で何が有効であるかを知るほど、ファイル名だけを照合する可能性が高くなります。ただし、Unixのファイル名には、/(パス名のセクション間の区切り文字なので)とNULバイトの\0以外の文字を含めることができます。他のすべて - 改行、タブ、コントロールなど - は公正なゲームであり、ファイル名の一部である可能性があります。慈悲深く、それらの大部分は通常ファイル名には存在しません。

相対パス名は、絶対パス名よりもさらに困難であることに注意してください。

1

/(.+/)*.*このパターンを使用してください。開始時にスラッシュ、その後にディレクトリ(存在しない可能性があります)、最後にファイル名またはディレクトリ名(これはあまりありません)。実際にはこれはスラッシュで始まるすべてのものと一致しますが、unixのパスには\0以外のすべてを含めることができるので問題ありません。

+0

perlでこれを正しく行う必要がありますか? $ line =〜m/regex/?? –

+0

はい。これを参照してくださいhttp://www.troubleshooters.com/codecorn/littperl/perlreg.htm – shift66

+0

if($ line =〜/[/](./[/])*.*/)、これは正しいですか? ? –

4

代わりにFile::Specコアモジュールを使用することをお勧めします。与えられたものが絶対パスであるかどうかを確認する必要がある場合は、file_name_is_absolute()を使用してください。相対パスを絶対パスに変換する必要がある場合は、rel2abs()を使用すると、パターンが表示されます。 )より簡単で読みやすい方法です。考える

関連する問題