Использование Java Regex для извлечения слова из имени пути - PullRequest
5 голосов
/ 11 апреля 2011

У меня есть такой каталог, и я пытаюсь извлечь слово «фотон» непосредственно перед «photon.exe».

C: \ workspace \ photon \ output \ i686 \ Diagnostics \ photon.exe (приостановлено) Поток (запущен)

Мой код выглядит так:

String path = "C:\workspace\photon\output\i686\diagnostic\photon.exe(Suspended) Thread(Running)";
Pattern pattern = Pattern.compile(".+\\\\(.+).exe");

Matcher matcher = pattern.matcher(path);

System.out.println(matcher.group(1));

Независимо от того, какие перестановки я пробую, я получаю IllegalStateExceptions и т. Д., Несмотря на то, что это регулярное выражение работает на http://www.regexplanet.com/simple/index.html.

Заранее спасибо за любую помощь. Я очень расстроен в этот момент>. <</p>

Ответы [ 4 ]

7 голосов
/ 11 апреля 2011

На самом деле вам нужно запустить matcher:

if ( matcher.find() ) {
    System.out.println(matcher.group(1));
}

Обратите внимание, что я использую matcher.find() выше вместо matcher.matches(), потому что ваше регулярное выражение не настроено для соответствия всей строке (оно не будет соответствовать части (Suspended...). Поскольку дело обстоит именно так, вам на самом деле не нужна преамбула с косой чертой; \\\\(.+).exe должно работать нормально.

Конечно, это упоминается в документации для group(int):

Броски:

IllegalStateException - Если совпадение еще не было предпринято или предыдущая операция не была выполнена

2 голосов
/ 11 апреля 2011

вы можете использовать следующее регулярное выражение: ^.*\\(.*)\.exe.*$ и имя файла будет в первой группе совпадений.Вот пример .

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main
{
    public static void main(final String[] args)
    {
        final String input = args[0];
        final Pattern pattern = Pattern.compile("^.*\\\\(.*)\\.exe.*$");
        final Matcher matcher = pattern.matcher(input);
        if (matcher.find())
        {
            System.out.println("matcher.group(1) = " + matcher.group(1));
        }
        else
        {
            System.out.format("%s does not match %s\n", input, pattern.pattern());
        }
    }
}

, запустите его с C:\workspace\photon\output\i686\diagnostic\photon.exe(Suspended) Thread(Running) в качестве ввода и вот ожидаемый результат:

matcher.group(1) = photon
0 голосов
/ 11 апреля 2011

Попробуйте это регулярное выражение: [\\d\\w]+\\.exe

Предполагается, что исполняемый файл имеет только цифры и буквы.

Другой вариант - использовать .+\\.exe для получения полного имени файла и использовать substring и lastIndexOf('\'), чтобы получить имя файла.
Вы также можете использовать new File(fullFilePath).getFileName(), что является более правильным способом сделать это, поскольку это спасет вас substring - но я не знаю, будет ли оно лучшепроизводительность.

0 голосов
/ 11 апреля 2011

(new java.io.File("C:\workspace\photon\output\i686\diagnostic\photon.exe(Suspended) Thread(Running)")).getName().split("\\.")[0];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...