Java Regex String Parse, пытаясь выяснить шаблон - PullRequest
4 голосов
/ 27 марта 2012
File file = new File("file-type-string-i-want-2000-01-01-01-01-01.conf.gz");
            Matcher matcher = pattern.compile("\\-(.*)\\-\\d{4}")).matcher(fileName);
            StringBuilder sb = new StringBuilder();
            while (matcher.find()) {
                sb.append(matcher.group());
            }
            stringList = Arrays.asList(sb.toString().split("-"));
            if (stringList.size() >= 2) {
                nameFragment = stringList.get(stringList.size() - 2);
            }

Желаемый результат заключается в извлечении

string-iwant 

из строк, которые выглядят следующим образом

file-type-string-iwant-2000-01-01-01-01-01.conf.gz 

К сожалению, формат для "string-iwant" не является фиксированнымдлина буквенно-цифровых символов, которые будут включать только ОДИН дефис, НО никогда не начинаются с дефиса.Форматирование даты соответствует, год всегда следует за строкой, поэтому мой текущий подход - сопоставить с -year, но у меня возникают трудности с исключением материала в начале.

Спасибо за любые мысли или идеи

Редактировать: обновленные строки

Ответы [ 3 ]

4 голосов
/ 27 марта 2012

Вот необходимое вам регулярное выражение:

\\-([^-]+\\-[^-]+)\\-\\d{4}\\-

В основном это означает:

  • - начинается с минус
  • ([^-]+\\-[^-]+) содержит 1 или более не минус символов, затем минус, затем 1 или более не минус символов. Эта часть захвачена.
  • -\d{4} знак минус и 4 цифры

Однако это будет работать только в том случае, если stuff-you-need имеет только один дефис (или постоянное количество дефисов, которые требуют исправления в регулярном выражении). В противном случае невозможно узнать, принадлежит ли строка file-type-string-i-want слову type тому, что вы хотите или нет.

Добавлено:

Если file-type всегда содержит ровно один дефис, вы можете захватить необходимую часть следующим образом:

[^-]+\\-[^-]+\\-(.*)\\-\\d{4}\\-

Пояснение:

  • [^-]+\-[^-]+\\- некоторое количество не дефисных символов, затем дефис, затем больше не дефисов. Это пропустит строку file-type со следующим дефисом.
  • \-\d{4}\- дефис, 4 цифры, затем другой дефис
  • (.*) все, что находится между предыдущими 2 инструкциями, фиксируется как строка, которую нужно выбрать
0 голосов
/ 27 марта 2012

Регулярное выражение, которое я бы использовал для этой цели, выглядит следующим образом:

Pattern p = Pattern.compile("[^-]+-[^-]+(?=-\\d{4})");

Что означает совпадение текста, содержащего ровно один дефис , за которым следует один дефис и год из 4 цифр .

Тогда вы можете просто взять matcher.group(0) в качестве сопоставленного текста, который в данном случае будет string-iwant.

0 голосов
/ 27 марта 2012

Если бы это был PHP, я бы использовал что-то вроде следующего для захвата этой строки.

/^(\w+\-){2}(?<string>.+?)\-\d{4}(\-\d{2}){5}(\.\w+){2}$/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...