Найти последовательность в тексте по крайней мере с одним di git И одной буквой И некоторыми другими условиями с RegEx - PullRequest
2 голосов
/ 23 февраля 2020

У меня есть следующие RegEx: (([a-zA-Z0-9?]{4,8})(-[a-zA-Z0-9?]{4,8})+-([a-zA-Z0-9?]{4,8}))

Как мне избежать совпадения последовательностей, которые не содержат по крайней мере один ди git И один символ (a-zA-Z)?

Например:

Этот текст: Hello World 123 abc 1AB2C-D3FGH-456I7-JK8LM-NOP9Q Hello World 123 abc должен возвращать 1AB2C-D3FGH-456I7-JK8LM-NOP9Q

и это: Hello World 123 abc 11111-1111-1111 Hello World 123 abc

или

Hello World 123 abc aaaa-aaaa-aaaa-aaa Hello World 123 abc

ничего не должно возвращать.

Я развиваюсь в Java и получаю такую ​​группу:

public List<String> getKeys() {
    keys = new ArrayList<>();
    Matcher matcher = KEY_REGEX.matcher(text);
    while (matcher.find()) {
        keys.add(matcher.group());
    }
    return keys;
}

Спасибо!

1 Ответ

3 голосов
/ 23 февраля 2020

Один из способов - использовать положительный прогноз (?= для проверки, по крайней мере, вхождения AZ и di git 0-9

, чтобы сопоставить вхождения в - в прогнозе чтобы найти и то, и другое, вы можете добавить его в класс символов.

При сопоставлении вы начинаете сопоставлять символы A-Z0-9 и повторяете группу, начинающуюся с -, чтобы не было последовательных вхождений * 1008. * а не в начале или в конце.

\b(?=[A-Z0-9-]*[A-Z])(?=[A-Z0-9-]*[0-9])[A-Z0-9]+(?:-[A-Z0-9]+)+\b
  • \b Граница слова
  • (?=[A-Z0-9-]*[A-Z]) Установить символ AZ
  • (?=[A-Z0-9-]*[0-9]) Подтвердить di git 0-9
  • [A-Z0-9]+ Совпадение 1+ вхождений A-Z0-9
  • (?:-[A-Z0-9]+)+ Повторить сопоставление 1+ вхождений A-Z0-9 с - с добавлением
  • \b Граница слова

Regex demo

Примечание , что [A-z] соответствует больше чем [A-Za-z]


Ограничение класса символов 4-8 случаями:

\b(?=[A-Z0-9-]*[A-Z])(?=[A-Z0-9-]*[0-9])[A-Z0-9]{4,8}(?:-[A-Z0-9]{4,8})+\b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...