Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для iceglen
25 / 25 / 3
Регистрация: 24.06.2013
Сообщений: 109

Распарсить имя файла, номер копии и его расширение

06.04.2015, 17:30. Показов 2315. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема с регулярками - в Sublime Text 3 они работают нормально, а в жаве не хотят.

примеры имен файлов:

Code
1
2
3
4
5
6
7
8
9
10
153 ГИКЦ МО.xlsm
1) 153 ГИКЦ МО - 2.xlsm
2) 153 ГИКЦ МО - 3.xlsm
3. ГУК.НД МО РФ - 4.xlsx
4) ГУКНД МО РФ - 5.xlsx
5) ГУКНД МО РФ - 6.xls
D:\tmp\153 ГИКЦ МО.Контрольная.Декабрь2016.xlsm
153 ГИКЦ МО.Контрольная.Декабрь2016.xlsm
D:\tmp\153 ГИКЦ МО.Контрольная.Декабрь2016 - 1.xlsm
153 ГИКЦ МО.Контрольная.Декабрь2016 - 1.xlsm
регулярки (без экранирования):

Code
1
2
3
.+(?=\.xls.?$)   // имя файла
(?<=\s)\d+(?=\.xls.?$)   // номер копии
(?=\.xls.?$).+   // расширение файла
кусок кода:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
private String checkDirectory(File directory, String fileName) {
        String result = fileName;
        Integer number = 0;
 
        String nameRegex = ".+(?=\\.xls.?$)";
        Pattern namePattern = Pattern.compile(nameRegex);
        Matcher nameMatcher = namePattern.matcher(fileName);
 
        String numberRegex = "(?<=\\s)\\d+(?=\\.xls.?$)";
        Pattern numberPattern = Pattern.compile(numberRegex);
        Matcher numberMatcher = numberPattern.matcher(fileName);
 
        String extensionRegex = "(?=\\.xls.?$).+";
        Pattern extensionPattern = Pattern.compile(extensionRegex);
        Matcher extensionMatcher = extensionPattern.matcher(fileName);
 
        for (File file : directory.listFiles()) {
            if (fileName.equalsIgnoreCase(file.getName())) {
                if (numberMatcher.find()) {
                    number = Integer.parseInt(numberMatcher.group());
                    result = nameMatcher.group().substring(0, nameMatcher.group().indexOf(" - ")) + ++number + extensionMatcher.group();
                } else {
                    try {
                        nameMatcher = namePattern.matcher(file.getName());
                        extensionMatcher = extensionPattern.matcher(file.getName());
                        result = nameMatcher.group() + " - " + (++number) + extensionMatcher.group();
                    } catch (Exception e) {
                        System.out.println("File name: " + fileName);
                        System.out.println("Result:    " + result);
                        System.out.println("File:      " + file.getName());
                        System.out.println(nameMatcher);
                        System.out.println(extensionMatcher);
                        e.printStackTrace();
                    }
                }
            }
        }
        return result;
}
выхлоп:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:536)
    at java.util.regex.Matcher.group(Matcher.java:496)
    at ru.niicps.center.control.service.card.template.CardTemplateServiceImpl.checkDirectory(CardTemplateServiceImpl.java:294)   // <----- номера строк не соответствуют действительности, т.к. выдрал кусок
    at ru.niicps.center.control.service.card.template.CardTemplateServiceImpl.createCardTemplate(CardTemplateServiceImpl.java:122)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:122)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy58.createCardTemplate(Unknown Source)
    at ru.niicps.center.control.client.actionexecutors.components.dialog.DialogMonthActionExecutor.monthCardTemplateStep(DialogMonthActionExecutor.java:109)
    at ru.niicps.center.control.client.controllers.controller.components.MenuController$$Lambda$578/444954294.call(Unknown Source)
    at ru.niicps.center.control.client.controllers.controller.components.dialog.DialogMonthController.lambda$create$118(DialogMonthController.java:122)
    at ru.niicps.center.control.client.controllers.controller.components.dialog.DialogMonthController$$Lambda$583/942262730.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)
прошу помочь либо составить другие регулярки либо понять почему эти не работают (в саблайме работают)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.04.2015, 17:30
Ответы с готовыми решениями:

Выделить из полного пути файла его имя и расширение
помогите пожалуйста написать программу 1. дана строка, содержащая полное имя файла, то есть, имя диска, список каталогов (путь),...

Поменять имя файла, сохраняя его адрес и расширение
Нужно сменить имя файла но оставить адрес и розширение char *fname=&quot;C:\\users\\lylyk\\desktop\\laba7.txt&quot; После смены должно...

Введите имя файла и расширения и измените его расширение на «.exe»
Введите имя файла(оно может быть как с расширением, так и без расширения) и измените его расширение на «.exe» Пример: Введите имя файла:...

2
18 / 18 / 12
Регистрация: 27.03.2015
Сообщений: 72
06.04.2015, 18:15
Всё нормально парсится

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.regex.*;
 
public class Test {
  static String[] files = {
    "153 ГИКЦ МО.xlsm",
    "1) 153 ГИКЦ МО - 2.xlsm",
    "2) 153 ГИКЦ МО - 3.xlsm",
    "3. ГУК.НД МО РФ - 4.xlsx",
    "4) ГУКНД МО РФ - 5.xlsx",
    "5) ГУКНД МО РФ - 6.xls",
    "D:\tmp\153 ГИКЦ МО.Контрольная.Декабрь2016.xlsm",
    "153 ГИКЦ МО.Контрольная.Декабрь2016.xlsm",
    "D:\tmp\153 ГИКЦ МО.Контрольная.Декабрь2016 - 1.xlsm",
    "153 ГИКЦ МО.Контрольная.Декабрь2016 - 1.xlsm"};
 
  static Pattern p = Pattern.compile("(.*?)(\\s*-\\s*(\\d+))?\\.(\\w+)");
  
  public static void main(String[] args) throws Exception {
    for(int i=0; i<files.length; i++) {
      Matcher m = p.matcher(files[i]);
      if(m.matches())
        System.out.println("["+m.group(1)+"]  ["+m.group(3)+"]  ["+m.group(4)+"]");
    }
  }
}
1
 Аватар для iceglen
25 / 25 / 3
Регистрация: 24.06.2013
Сообщений: 109
06.04.2015, 22:47  [ТС]
Ну я не говорил, что распарсить нереально. Все же хотелось бы услышать почему регулярки, составленные мною не работают.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.04.2015, 22:47
Помогаю со студенческими работами здесь

Дано полное имя файла, т.е путь к файлу, имя и расширение. Выделить из строки только имя первого католога
Помогите пожалуйста!!! Залание: Дано полное имя файла, т.е путь к файлу, имя и расширение. Выделить из строки только имя первого...

Дана строка, содержащая полное имя файла. Выделить из этой строки имя и расширение файла
дана строка, содержащая полное имя файла, т.е. имя диска, список каналов(путь), собственно имя и расширение.выделить 1) из этой строки имя...

Ввести имя файла с расширением и заменить его на расширение ".exe"
Ввести имя файла( с расширением )и Заменить его на расширение &quot;.exe&quot; Помогите кто чем может)

Ввести имя файла (с расширением) и заменить его на расширение ".exe"
Ввести имя файла( с расширением )и Заменить его на расширение &quot;.exe&quot; Помогите кто чем может)

Ввести имя файла (возможно, без расширения) и изменить его расширение на ".exe".
символьные строки: Ввести имя файла (возможно, без расширения) и изменить его расширение на &quot;.exe&quot;. Пример: Введите имя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru