Java, получение части шаблона частично совпадает с вводом - PullRequest
0 голосов
/ 05 ноября 2018

Как видно из заголовка, я бы хотел получить часть паттерна , которая частично соответствует входным данным; Пример:

Выкройка: аабб Входная строка: «аа»

На этом этапе я буду использовать метод hitEnd () класса Matcher, чтобы выяснить, соответствует ли шаблон частично, как показано в этом ответе , но я также хотел бы выяснить, что конкретно "аа" из "аабб" совпадает. Есть ли способ сделать это в Java?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

В классе Matcher такой функции нет. Однако вы можете достичь этого, например, так:

public String getPartialMatching(String pattern, String input) {
    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(input);
    int end = 0;
    while(m.find()){
        end = m.end();
    }
    if (m.hitEnd()) {
        return input.substring(end);
    } else {
        return null;
    }
}

Сначала переберите все подходящие части строки и пропустите их. Например: input = "aabbaa" m.hitEnd() вернет false без пропуска aabb. Во-вторых, проверьте, если левая часть строки частично совпадает.

0 голосов
/ 05 ноября 2018

Это может быть грязно, но здесь мы идем ...

Как только вы узнаете, что какая-то строка hitEnd, выполните вторую обработку:

  1. Удалить последний символ из строки
  2. Поиск с оригинальным регулярным выражением
  3. Если это matches, то вы закончили и у вас есть часть строки
  4. Если нет, переходите к 1 и повторяйте весь процесс до совпадения

Если тестовые строки могут быть длинными, производительность может быть проблемой. Поэтому вместо позиций с последнего на первое попробуйте поискать блоки.

Например, учитывая строку из 1000 символов:

  1. Тест 1000/2 символов: 1-500. Для этого примера мы считаем, что это соответствует
  2. Тест на первые 500 символов + 500/2 (1-750 позиций). Для этого примера мы считаем, что он не совпадает. Итак, мы знаем, что позиция должна быть от 500 до 750
  3. Теперь проверьте 1-625 ((750 + 500) / 2) ... Если оно совпадает, позиции должны существовать между 625-750. Если оно не совпадает, оно должно быть от 500 до 625
  4. ...
...