假设我有一个字符串,其中包含一个文件的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]+
它完成了这些测试用例的工作。
现在,我担心这个可以拉出其他不是文件路径的文本,只看起来像一个,因为它在正确的位置有斜杠和点。
有没有更好的方法来处理这个问题(甚至可能不使用正则表达式)?
答案 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”之类的东西而失败。