Regex - слова в любом порядке - PullRequest
2 голосов
/ 12 марта 2020

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

  1. "ab" появляется ровно 1 раз
  2. "cd" появляется ровно 2 раза
  3. "ef" появляется ровно 3 раза

Допустим, они должны разделяться 1 запятой.

Это должно соответствовать чему-то вроде:

  • ab,ef,cd,ef,cd,ef
  • cd,cd,ef,ab,ef,ef

Должен не совпадать:

  • ab,cd,ef // слишком короткая

  • ab,xx,ef,cd,ef,cd,ef // xx, недействительна

  • xx,ab,cd,cd,ef,ef,ef // xx, недействительна

Я нашел:

\b(?=\w*ab)(?=\w*cd)(?=\w*ef)[abcdcdefefef]{12}\b

, но Я не могу найти запятую и Я не хочу добавлять все слова с количеством букв в конец ([abcdcdefefef] {12}), потому что мне нужно использовать это для множества больших строк.

Спасибо за помощь!

Ответы [ 2 ]

4 голосов
/ 12 марта 2020

Забудьте регулярное выражение.

    Map<String, Long> expectedFreqTable = new HashMap<>();
    expectedFreqTable .put("ab", 1L);
    expectedFreqTable .put("cd", 2L);
    expectedFreqTable .put("ef", 3L);

    String[] words = input.split(",");
    Map<String, Long> actualFreqTable = Stream.of(words)
            .collect(Collectors.groupingBy(Function.identity(), 
                    Collectors.counting()));

    return expectedFreqTable.equals(actualFreqTable);

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

1 голос
/ 12 марта 2020

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

String[] inputs = new String[] {
    "ab,ef,cd,ef,cd,ef",    // should match
    "cd,cd,ef,ab,ef,ef",    // should match
    "ab,cd,ef",             // too short
    "ab,xx,ef,cd,ef,cd,ef", // xx, is invalid
    "xx,ab,cd,cd,ef,ef,ef"  // xx, is invalid
};
List<String> list = Arrays.asList(inputs);
String regex = "(?=.*ab)(?=.*cd.*cd)(?=.*ef.*ef.*ef)[a-f]{2}(?:,[a-f]{2}){5}";

list.stream().forEach(x -> {
    if (x.matches(regex)) {
        System.out.println("MATCH:    " + x);
    }
    else {
        System.out.println("NO MATCH: " + x);
    }
});

Это печатает:

MATCH:    ab,ef,cd,ef,cd,ef
MATCH:    cd,cd,ef,ab,ef,ef
NO MATCH: ab,cd,ef
NO MATCH: ab,xx,ef,cd,ef,cd,ef
NO MATCH: xx,ab,cd,cd,ef,ef,ef
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...