5

ビルド済みの SFTP クライアントを使用して、サーバーから多数の zip ファイルを取得する必要がある状況があります。_PROCESSEDファイル名に含まれていないものだけが必要です。たとえば、covers.zip大丈夫ですが、そうでcovers_PROCESSED.zipはありません。これはlsFiles()、ディレクトリ内のすべてのファイル名を返し、ファイル名にそのキーワードが含まれているかどうかに基づいてそれらをフィルタリングする関数を実行します。その後、それらはサーバーからプルされます。

ただし、私が使用している sftp クライアントには、次の関数もlsFiles(String pattern)あります。これは、パターンに一致するものをすべて返します。この関数を使用して、必要なファイル名のみを取得したいと考えています。これにより、コードが少し短縮され、最適化されるからです。問題は、指定されたパターンがない場合 (またはこれが可能である場合) にのみ一致する正規表現を作成する方法がわからないことです。これが可能かどうかを誰かに教えてもらえますか? もしそうなら、これを行う方法の例を提供してもらえますか?

4

3 に答える 3

4

さすがです、社長

/(?!_PROCESSED)/

これは否定先読みであり、ほぼすべての正規表現でサポートされています

于 2013-07-26T14:38:09.963 に答える
0

この種のパターンを使用して、特定の部分文字列を除外できます。

^(?>[^_]++|_(?!PROCESSED))+$

ご覧のとおり、[^_]++ (all that is not a _)_(?!PROCESSED) ( _not followed by PROCESSED)の間で交互に使用します。

_PROCESSEDこの種のパターンの興味深い点は、除外したい文字列の最初の文字に遭遇したときだけ、どこかにない場合に文字ごとにチェックすることを避けることです。したがって、テスト数は大幅に削減されます。

naomik によって提案された機能は、あなたがやろうとしていることに適しているようです:

listFilesMatching(new File("/some/path", "^(?>[^_]++|_(?!PROCESSED))+$");
于 2013-07-26T16:19:08.680 に答える
0

クライアントが真の正規表現でフィルタリングする場合、

lsFiles("(?!_PROCESSED)\.zip") 

zip処理されなかったすべてのファイルを返す必要があります。しかし、通常、ファイル フィルターは (さまざまな) 単純なワイルドカード置換を許可するだけな*.zipので、これが実際に機能した場合は驚くでしょう。そうでない場合は、すべての.zipファイルのリストを取得してそれらをフィルタリングするのが正しいアプローチですが、それは既にご存知のとおりです。

于 2013-07-26T15:00:27.923 に答える