Как извлечь Unix-стиль локальных файловых путей из строки? - PullRequest
1 голос
/ 26 февраля 2011

Допустим, у меня есть строка, которая содержит локальный путь в стиле 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 Ответ

3 голосов
/ 26 февраля 2011

Вы не можете сделать это. Имена файлов 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» в исходном тексте.

...