-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"}

它应该将每个字符串与另一个字符串进行比较,在上述情况下,如果我们考虑 2 个字符串“/root/test1/asass”和“/root/test1”,它的最长公共前缀为 /root/test1,因此我们将其添加到输出列表,如果有任何其他以 /root/test1 开头的字符串,它将由 /root/test1 表示。

在它旁边有五个以 /root/test 开头的字符串,输出列表将包含 /root/test,因为这 5 个字符串的最长公共前缀为“/root/test”。

同样,只有 1 个字符串具有模式 /etc/rahul/test,它不共享或以定义的任何其他模式开头,因此将按原样添加,

我们可以使用正则表达式来做到这一点吗?任何建议都会非常有帮助。如果需要任何其他信息,请告诉我。

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 回答
1

描述

在查看了详细的聊天窗口后,我看到您有来自 M Buettner 的示例文本:

(diverging at level 1) 
/root/abc/foo 
/etc/def/bar 
would give two entries 

(diverging at level 2) 
/root/abc/foo 
/root/def/foo 
would give two entries 

(diverging at level 3 and beyond) 
but 
/root/abc/def/ghi 
/root/abc/klm/nop 
would give only one entry? (/root/abc/)

看起来您想要从字符串开头到第三个的每个唯一字符串/

这个 powershell [对不起,我不太了解 java] 确实返回了唯一值。

$folders = New-Object System.Collections.ArrayList
$null = $folders.add("/root/test1/asass")
$null = $folders.add("/root/test1")
$null = $folders.add("/root/test")
$null = $folders.add("/root/test/aaa")
$null = $folders.add("/root/test/bbb/ccc")
$null = $folders.add("/root/test/fff")
$null = $folders.add("/root/test/eee")
$null = $folders.add("/root/rahul/e?ee/aaaaa")
$null = $folders.add("/root/rahul/aaa")
$null = $folders.add("/root/rahul/no*tthis/aaaaa")
$null = $folders.add("/root/rahul/test")
$null = $folders.add("/etc/rahul/test")

Write-Host "------"

$Output = New-Object System.Collections.ArrayList
foreach ($folder in $folders) {
    [regex]::Match($folder, "^(\/(?:.*?(?:\/|$)){0,2})", "Multiline") | foreach {
        # found a match set
        $null = $Output.add($_.Groups[1].Value)
        } # next match
    } # next folder


$Output | select -unique

退货

/root/test1/
/root/test1
/root/test
/root/test/
/root/rahul/
/etc/rahul/
于 2013-07-02T19:05:02.173 回答