Сопоставление с образцом для соответствия самой длинной подстроке

У меня есть это регулярное выражение D+U.

Он должен совпадать один раз для следующей строки UDDDUDUU, но с Java он совпадает три раза. Соответствует DDDU DU. Я использую https://regex101.com/ для проверки своего регулярного выражения, и оно должно совпадать только один раз, DDDU .

Я пытаюсь решить эту проблему, =AT3UrOLAOixN0_fTXXw7i6Uff8CgJv4D5fSMPGri3b239xAMjWIXTesyycK0TSfity6NfYBLsJaL1sy5boqIZ4oBGBEA-Q5_RKPUgYS_MwrQ3_iHBBi2CaR-P5Gs1dxTj_5jr25ONg" rel="nofollow noreferrer">Hacker Я также пытаюсь использовать шаблоны, потому что хочу попрактиковаться в использовании этих классов.

Что именно я делаю неправильно?

Это мой код:

static int match(int n, String s) {
    Matcher matcher = Pattern.compile("D+U").matcher(s);
    int count = 0;
    int i = 0;
    while (matcher.find(i)) {
        count++;
        i = matcher.end() + 1;
    }
    return count;
}

person Pants    schedule 15.09.2018    source источник
comment
Если вы просто ищете самое длинное совпадение, вам нужно перебрать все совпадения и выбрать самое длинное самостоятельно.   -  person NPE    schedule 15.09.2018
comment
Я добавил больше контекста @NPE   -  person Pants    schedule 15.09.2018
comment
Ссылка не может быть единственным ресурсом о проблеме, которую вы пытаетесь решить. Если ссылка порвется (что случается довольно часто) вопрос останется неясным. Опишите, что должен делать ваш код в вопросе таким образом, чтобы не требовалось от других переходить по ссылке.   -  person Pshemo    schedule 15.09.2018
comment
Кажется, вы хотите просто [UD]+   -  person Wiktor Stribiżew    schedule 16.09.2018


Ответы (1)


Регулярное выражение + соответствует одному или нескольким предшествующим символам/регулярным выражениям. Так что это будет соответствовать любой последовательности D и U.

Если вы хотите вернуть самое длинное совпадение, которое вы можете сделать:

static String match(String s) {
    ArrayList<String> matches = new ArrayList<>();
    Matcher matcher = Pattern.compile("D+U").matcher(s);
    int i = 0;
    while (matcher.find(i)) {
       matches.add(matcher.group());
       i = matcher.end();
    }   
    return Collections.max(matches, Comparator.comparing(c -> c.length()));
}

Который (с тестовым примером UDDDUDUU) возвращает DDDU. Также обратите внимание, что я удалил параметр n, так как вы никогда его не использовали.

person GBlodgett    schedule 15.09.2018
comment
Я добавил больше контекста. Это не решает проблему, спасибо. - person Pants; 15.09.2018
comment
@Pants Я не могу получить доступ к ссылке. Что должен делать этот метод? - person GBlodgett; 15.09.2018