Java 如何从字符串中提取Unix样式的本地文件路径?

Java 如何从字符串中提取Unix样式的本地文件路径?,java,regex,filepath,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="" />" 我提出了以下正则表达式: \.?[[a-zA-Z0-9]*

假设我有一个字符串,其中包含指向文件的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="" />"
我提出了以下正则表达式:

\.?[[a-zA-Z0-9]*/]+\.[a-zA-Z0-9]+
它完成了这些测试用例的工作

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


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

你做不到。Unix文件名可以包含除NUL和
/
s之外的任何内容,因此任何没有嵌入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”之类的内容而失败。

我不明白如何编写能够区分实际文件路径和看起来像文件路径的内容的内容。除非您还能够将这些路径验证为现有文件的实际路径。如果有人写下“在Stackoverflow上,您可以向上/向下投票”怎么办。“向上/向下”可以是一个文件路径,如果没有某种上下文感知或人工智能,就无法知道。@johusman:没错。我当前的正则表达式不会提取“up/down”,只是因为它没有文件扩展名。由于文件确实不必有扩展名,这不是一个很好的理由。术语“扩展名”是特定于DOS/Windows的,它确实是文件名的一个特殊部分。在类Unix系统上,它只是文件名的一部分,恰好由点与其余部分隔开。所以你完全正确,这不会有什么帮助。难道没有标准的Java类可以做到这一点吗?它与Perl的类相对应吗?单独使用正则表达式似乎是一个糟糕的主意,尤其是考虑到Java对Unicode的讨厌程度,Java有自己的类来处理文件路径,但这不是问题所在。问题是要找出路径的位置,而fileparse()在这方面对您没有任何帮助。正如johusman所指出的那样,这需要某种科幻人工智能。似乎唯一的方法是定义“合理”的文件名,如你所建议的,覆盖足够大的案例子集。谢谢
[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";