Вернуть подстроку, используя regExp [Java] - PullRequest
2 голосов
/ 10 октября 2019

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

Имена файлов составляются таким образом, мне нужно получить строку жирным шрифтом

* *
1005 * Doc20191001119049_ 1006 * fotocontargasx _3962122_943000.jpg

1010 * Doc201810011052053_ * fotoAssicurazioneCartaceo _3962128_943000.jpg

* * 1013 Doc201910011214020_ fotoesterna_ant _396024_947112.jpg

Doc201710071149010_ foto_TargaMid _4007396_95010.jpg

В настоящее время я реализовал это:

Pattern rexExp = Pattern.compile("_[a-zA-Z0-9]+_");

Но не работает должным образом

Ответы [ 3 ]

3 голосов
/ 10 октября 2019

Решение 1: Сопоставление / извлечение

Вы можете захватить \w+ шаблон внутри _ s, за которым следует [digits][_][digits][.][extension]:

Pattern rexExp = Pattern.compile("_(\\w+)_\\d+_\\d+\\.[^.]*$");

См. Регулярное выражение демо

Подробности

  • _ - подчеркивание
  • (\w+) - 1+ букв / цифр / _
  • _ - подчеркивание
  • \d+ - 1+ цифр
  • _\d+ - _ и 1+ цифр
  • \. - точка
  • [^.]* - 0+ символов, отличных от .
  • $ - конец строки.

OnlineДемонстрационная версия Java :

String s = "Doc201810011052053_fotoAssicurazioneCartaceo_3962128_943000.jpg";
Pattern rexExp = Pattern.compile("_(\\w+)_\\d+_\\d+\\.[^.]*$");
Matcher matcher = rexExp.matcher(s);
if (matcher.find()){
    System.out.println(matcher.group(1)); 
} // => fotoAssicurazioneCartaceo

Решение 2. Обрезание ненужного префикса / суффикса

Вы можете удалить все с самого начала до первого _, включая его, и [digits][_][digits][.][extension] в конце:

.replaceAll("^[^_]*_|_\\d+_\\d+\\.[^.]*$", "")

См. эту демонстрационную версию регулярного выражения

Подробности

  • ^[^_]*_ -начало строки, 0+ символов, отличных от _, а затем _
  • | - или
  • _\d+_\d+\.[^.]*$ - _, 1+ цифр, _,1+ цифры, . и затем 0+ символов, отличных от . до конца строки.
1 голос
/ 10 октября 2019

В дополнение к точному ответу Виктора , вот «быстрый и грязный» способ сделать это, что делает следующее вводное предположение о вводе: «Обязательная строка - это не числа, заключенные в числаи вход всегда является допустимым путем к файлу ".

public static void main(String[] args) {
  String[] strs = {"Doc20191001119049_fotocontargasx_3962122_943000.jpg", "Doc201810011052053_fotoAssicurazioneCartaceo_3962128_943000.jpg", "Doc201910011214020_fotoesterna_ant_396024_947112.jpg", "Doc201710071149010_foto_TargaMid_4007396_95010.jpg"};
  var p = Pattern.compile("_([\\D_]+)_");
  for(var str : strs) {
    var m = p.matcher(str);
    if(m.find()) {
      System.out.println("found: "+m.group(1));
    }
  }
}

Вывод:

found: fotocontargasx
found: fotoAssicurazioneCartaceo
found: fotoesterna_ant
found: foto_TargaMid
0 голосов
/ 10 октября 2019

Шаблон: (?<=_).+(?=(_\d+){2}\.)

    final String s = "Doc20191001119049_fotocontargasx_3962122_943000.jpg\n"
        + "\n"
        + "Doc201810011052053_fotoAssicurazioneCartaceo_3962128_943000.jpg\n"
        + "\n"
        + "Doc201910011214020_fotoesterna_ant_396024_947112.jpg\n"
        + "\n"
        + "Doc201710071149010_foto_TargaMid_4007396_95010.jpg";
    Pattern pattern = Pattern.compile("(?<=_).+(?=(_\\d+){2}\\.)");
    Matcher matcher = pattern.matcher(s);
    List<String> allMatches = new ArrayList<>();

    while (matcher.find()) {
        allMatches.add(matcher.group());
    }

Выход: [fotocontargasx, fotoAssicurazioneCartaceo, fotoesterna_ant, foto_TargaMid]

...