-3

Javaでこれに似たようなことをしたい(文字列のリストから共通のプレフィックスを抽出する)。文字列のリストはファイルパスです Eg: List filePaths1 = new ArrayList();
filePaths1.add("/root/test1/asass");
filePaths1.add("/root/test1");
filePaths1.add("/root/test");
filePaths1.add("/root/test/aaa/");
filePaths1.add("/root/test/bbb/ccc
");
filePaths1.add("/root/test/fff/");
filePaths1.add("/root/test/eee/asasa/
");
filePaths1.add("/root/rahul/e?ee/asasa/");
filePaths1.add("/root/rahul/asasa/
");
filePaths1.add("/root/rahul/no*tthis/asasa/**");
filePaths1.add("/etc/rahul/test");

上記のリストを渡すと、次の文字列のリストを返す関数を実装したいと考えています。

{"/root/test1", "/root/test", "/root/rahul", "/etc/rahul/test"}

各文字列を別の文字列と比較する必要があります。上記の場合、「/root/test1/assass」と「/root/test1」の 2 つの文字列を考慮すると、共通のプレフィックスが最も長いのが /root/test1 であるため、出力に追加します。 /root/test1 で始まる文字列が他にある場合は、/root/test1 で表されます。

その隣に /root/test で始まる 5 つの文字列があるため、出力リストには /root/test が含まれます。これは、これらの 5 つの文字列が「/root/test」として最も長い共通プレフィックスを持っているためです。

同様に、パターン /etc/rahul/test を持つ文字列は 1 つしかありません。これは、共有されていないか、定義されている他のパターンで始まるため、そのまま追加されます。

正規表現を使用してこれを行うことはできますか? どんな提案も本当に役に立ちます。他に必要な情報があれば教えてください。

4

2 に答える 2

1

説明

私があなたを正しく理解していれば、リスト内の各フォルダーの最大公分母を特定する方法を探しています。フォルダーの大きなリストを提供しているようで、すべてのエントリをふるいにかけ、最大のものだけを返したいと考えています。その追加の処理ロジックは、この式の範囲を超えています。

与えられた:

/root/test1/aaaaa
/root/test2/bbbbb
/root/test3/ccccc

/root/すべてのエントリに共通のフォルダであることが期待されます。

与えられたのに対し:

/root/test1/aaaaa
/root/test1/bbbbb
/root/test1/ccccc

/root/test1/共通フォルダーであることが期待されます。

この正規表現は、上記のサンプルで最大の分母を見つけます。これを使用して、すべての値を反復処理し、それらを一致させ、目的のロジックに基づいて結果の配列を構築できます。

^(\/.*(?=[\/\n\r])).*[\r\n]*(?:^(?=\1).*?[\r\n]*)*\Z

ここに画像の説明を入力

注: 例をわかりやすくするために、大文字と小文字を区別しないオプションを使用しています。ファイル レベルで大文字と小文字を区別する *nix システムで実行している場合は、これを削除することをお勧めします。また、この式を使用するには、次のような複数行オプションが必要です。

Pattern re = Pattern.compile("^(\\/.*(?=[\\/\\n\\r])).*[\\r\\n]*(?:^(?=\\1).*?[\\r\\n]*)*\\Z",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

OPではっきりしない

はっきりしていないのは、次のようなリストをどのように処理するかです。

/root/test1/test2/test3/aaaaa
/root/test1/test2/bbbbb
/root/test1/ccccc
于 2013-07-02T15:51:24.503 に答える