Регулярное выражение Java соответствует двум одинаковым номерам - PullRequest
0 голосов
/ 30 августа 2018

Я хочу использовать RE для сопоставления путей к файлам, как показано ниже:

../90804/90804_0.jpg
../89246/89246_8.jpg
../89247/89247_14.jpg

В настоящее время я использую приведенный ниже код для соответствия:

Pattern r = Pattern.compile("^(.*?)[/](\\d+?)[/](\\d+?)[_](\\d+?).jpg$");
Matcher m = r.matcher(file_path);

Но я обнаружил, что это будет неожиданный матч, например:

../90804/89246_0.jpg

В RE невозможно сопоставить два одинаковых числа?

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Вы можете использовать \2 обратную ссылку вместо второй \d+ здесь:

s.matches("(.*?)/(\\d+)/(\\2)_(\\d+)\\.jpg")

См. Демоверсию regex . Обратите внимание, что если вы используете метод matches, вам не понадобятся якоря ^ и $.

Детали

  • (.*?) - Группа 1: любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • / - косая черта
  • (\\d+) - Группа 2: одна или несколько цифр
  • / - косая черта
  • (\\2) - Группа 3: то же значение, что и в Группе 2
  • _ - подчеркивание
  • (\\d+) - Группа 4: одна или несколько цифр
  • \\.jpg - .jpg.

Java демо :

Pattern r = Pattern.compile("(.*?)/(\\d+)/(\\2)_(\\d+)\\.jpg");
Matcher m = r.matcher(file_path);
if (m.matches()) {
    System.out.println("Match found");
    System.out.println(m.group(1));
    System.out.println(m.group(2));
    System.out.println(m.group(3));
    System.out.println(m.group(4));
}

Выход:

Match found
..
90804
90804
0
0 голосов
/ 30 августа 2018

это regEx ^(.*)\/(\d+?)\/(\d+?)_(\d+?)\.jpg$

совпадает с такими строчками:

../90804/90804_0.jpg
../89246/89246_8.jpg
../89247/89247_14.jpg

на 4 части.

См. Пример Результат:

enter image description here

0 голосов
/ 30 августа 2018

Вы можете использовать это регулярное выражение с группой захвата и обратной ссылкой:

(\d+)/\1

RegEx Demo

Эквивалентная строка регулярного выражения Java будет:

final String regex = "(\\d+)/\\1";

Подробности:

  • (\d+): сопоставьте цифры 1+ и захватите их в группе № 1
  • /: математический литерал /
  • \1: используя обратную ссылку # 1, сопоставить тот же номер, что и в группе # 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...