如何从字符串中提取Unix风格的本地文件路径?

时间:2011-02-26 13:17:21

标签: java regex filepath

假设我有一个字符串,其中包含一个文件的Unix风格的本地路径,如下面的示例所示:

 String s1 = "something something ./files/icon.gif";
 String s2 = "The files are texts/text1.txt and texts/text2.txt";
 String s3 = "<img src="images/img/run.png" alt="" />"

所以,我只需要提取文件路径:

 "./files/icon.gif"
 "texts/text1.txt", "texts/text2.txt"
 "images/img/run.png"

我想出了以下正则表达式:

\.?[[a-zA-Z0-9]*/]+\.[a-zA-Z0-9]+

它完成了这些测试用例的工作。

现在,我担心这个可以拉出其他不是文件路径的文本,只看起来像一个,因为它在正确的位置有斜杠和点。

有没有更好的方法来处理这个问题(甚至可能不使用正则表达式)?

1 个答案:

答案 0 :(得分:3)

你不能这样做。 Unix文件名除了NUL和/之外几乎可以包含任何内容,因此任何没有嵌入NUL的字符串都是有效路径。参见:

[alqualos@brededor tmp]$ mkdir -p 'String s1 = "something something ./files/icon.gif";'
[alqualos@brededor tmp]$ ll -d String*
drwxr-xr-x 3 alqualos alqualos   4096 2011-02-26 16:31 String s1 = "something something .
[alqualos@brededor tmp]$ ll String\ s1\ \=\ \"something\ something\ ./
total 4K
drwxr-xr-x 3 alqualos alqualos 4096 2011-02-26 16:31 files
[alqualos@brededor tmp]$ ll String\ s1\ \=\ \"something\ something\ ./files/
total 4K
drwxr-xr-x 2 alqualos alqualos 4096 2011-02-26 16:31 icon.gif";

所以你的所有字符串都是有效的文件路径。如果你想提取看起来像“合理”路径的所有东西,那么你必须首先定义“合理”,即使那样你也可能因为源文本中的“TCP / IP”之类的东西而失败。