2013-08-15 3 views
1

Я пытаюсь найти регулярное выражение, которое будет соответствовать следующий формат:Regex для соответствия «путь/* расширение.»

path/*.file_extension 

Например:

temp/*.jpg 
usr/*.pdf 
var/lib/myLib.so 
tmp/ 

Использование регулярных выражений, я хотите сохранить совпадающие части в массив String, такие как:

String[] tokens; 
// regex magic here 
String path = tokens[0]; 
String filename = tokens[1]; 
String extension = tokens[2]; 

в случае последнего случая tmp/, т hat не содержит имени файла и расширения, тогда токен [1] и токен [2] будут иметь значение null. В случае: usr/*.pdf тогда токен [1] будет содержать только строку "*".

Большое спасибо за помощь.

+0

Можете ли вы показать нам, что вы пробовали? –

+0

Вводится как 'usr/*' или 'usr /*.*' возможно? – Pshemo

+0

@Pshemo, да, безусловно. – Maestros

ответ

2

Если вы можете использовать Java7, то вы можете использовать именованные группы, как этот

String data = "temp/*.jpg, usr/*.pdf, var/lib/*.so, tmp/*, usr/*, usr/*.*"; 

Pattern p = Pattern 
     .compile("(?<path>(\\w+/)+)((?<name>\\w+|[*]))?([.](?<extension>\\w+|[*]))?"); 

Matcher m = p.matcher(data); 
while (m.find()) { 
    System.out.println("data=" + m.group()); 
    System.out.println("path=" + m.group("path")); 
    System.out.println("name=" + m.group("name")); 
    System.out.println("extension=" + m.group("extension")); 
    System.out.println("------------"); 
} 
0

Этот код должен wotk:

String line = "var/lib/myLib.so"; 
Pattern p = Pattern.compile("(.+?(?=/[^/]*$))/([^.]+)\\.(.+)$"); 
Matcher m = p.matcher(line); 
List<String> tokens = new ArrayList<String>(); 
if (m.find()) { 
    for (int i=1; i <= m.groupCount(); i++) { 
     tokens.add(m.group(i)); 
    } 
} 
System.out.println("Tokens => " + tokens); 

ВЫВОД:

Tokens => [var/lib, myLib, so] 
0

Я предполагаю, что вы используете Java. Это должно работать:

Pattern.compile("path/(.*?)(?:\\.(file_extension))?");

+0

Может быть, передать флаг 'Pattern.DOT_ALL'. Новые строки разрешены в именах файлов в большинстве основных операционных систем, поэтому нет причин сопоставлять имена файлов с пространствами, отличными от новой строки, но не соответствовать именам файлов с новыми символами. –

0

На другом подходе, простое использование «подстроку()/LastIndexOf() 'должны служить следующие цели:

String filePath = "var/lib/myLib.so"; 
    String fileName = filePath.substring(filePath.lastIndexOf('/')+1); 
    String path = filePath.substring(0, filePath.lastIndexOf('/')); 
    String fileName = fileName.substring(0, fileName.lastIndexOf('.')); 
    String extension = fileName.substring(fileName.lastIndexOf('.')+1); 

Обращаем ваше внимание, что вам необходимо обработать альтернативные сценарии, например путь к файлу без расширения.

0

Зачем использовать регулярное выражение? Я лично нахожу lastIndexOf более читабельным.

String path; 
String filename; 
@Nullable String extension; 

// Look for the last slash 
int lastSlash = fullPath.lastIndexOf('/'); 
// Look for the last dot after the last slash 
int lastDot = fullPath.lastIndexOf('.', lastSlash + 1); 
if (lastDot < 0) { 
    filename = fullPath.substring(lastSlash + 1); 
    // If there is no dot, then there is no extension which 
    // is distinct from the empty extension in "foo/bar." 
    extension = null; 
} else { 
    filename = fullPath.substring(lastSlash + 1, lastDot); 
    extension = fullPath.substring(lastDot + 1); 
} 
Смежные вопросы