2016-11-29 7 views
0

含まれているフォルダ/構造が問題ないかどうかを確認しています。これまで、ルートディレクトリには、ソースディレクトリ/sourcenが含まれていました。 RegExp ^sourcen私のためにこれをしました。RegExp - ルートまたはルート+1のサブディレクトリから一致

今、新しいケースがあります。

/SUBDIR/SUBDIR/sourcen 
/SUBDIR/SUBDIR/SUBDIR/sourcen 
/SUBDIR/SUBDIR/SUBDIR/SUBDIR/sourcen 
... 

がすることが可能です:それはこのようにもっとして1つのサブディレクトリを持っていない可能性があり

/sourcen 
/SUBDIR/sourcen 

しかし:それはこのようになりますので、ルートディレクトリにはsourcen-dirの前に、1つのサブディレクトリが含まれているかもしれませんRegExpを使用してsourcenディレクトリがルートにあるか、または1つのサブディレクトリ 'lower'にあることを検証しますか? /sourcenまたは/other/sourcen

$dir =~ m|^/ (?: [^/]+ /)? sourcen|x; 

/xは読みやすくするために、内部のスペースを使用できますかどうかを確認するには

+0

私はチェックされた文字列の最後の部分だけを取得したくありません。私はsourcen dirが存在する前にルートの後に最大1のサブディレクトリがあることを確認する必要があります。今度は、ファイル名のように最後の試合を探すだけで、これとは違うものになります。 – Yaerox

答えて

4

。慣習的な/の代わりに|が使用されていますので、パターン内に/をエスケープすることなく使用できます。

()を追加することで、どのような場合であるかを知ることができるようにするには、全体(またはその部分)をキャプチャします。これはルートから始まるので、


我々は/で(^)を起動します。

[^/]+は、/ではない文字を1回以上チェックします(+)。したがって、文字列は最初の/まで一致します。構成体[^...]は、というネゲートされた文字クラスと呼ばれます。それを参照してくださいin perlretutin perlrecharclass。 これにはリテラル/が続き、別のディレクトリが必要です。

すべてこれはグループ化のために(?:)の内部にあるので、次のようにして任意に設定することができます。?(0回または1回)。 ?:はそこにあるので、内部の全体のパターンはにありません。

このように、パターン(?:[^/]+/)?はオプションの最初のディレクトリです。

+0

これはうまくいくようです。私が理解するためにこれを説明できますか?私は '(?:[^ /] + /)'の部分を取得しません。 – Yaerox

+0

@ Yaerox説明を追加しました。私は確認し、おそらくもっと編集するが、それがはっきりしないかどうか私に知らせる。 – zdim

+1

@Yaeroxかなり編集して参考文献を追加しました。私は今のところそれを残すでしょう、もっと/より良いものが役に立つかどうか私に知らせてください。 – zdim

関連する問題