Повторите шаблон в RegEx - PullRequest
       2

Повторите шаблон в RegEx

0 голосов
/ 16 октября 2011

У меня есть части строки, которые соответствуют следующему шаблону.

ABCD | (| | абы | а) е (FGHI | (| F | фг | FGH) jklmn)

Но проблема у меня заключается в том, что вся моя строка повторяет комбинацию вышеупомянутых шаблонов. И вся моя строка должна содержать более 14 наборов вышеуказанного шаблона.
Может ли кто-нибудь помочь мне улучшить мой вышеупомянутый RegEx до требуемого формата.

Спасибо

Обновление
Введите примеры:
Соответствующие строки: abcd, abefgjkln, efjkln, ejkln
Но вся строка выглядит так: abcdabefgjklnefjklnejkln (комбинация из 4 частей выше)

В строке должно быть более 15 частей. Над одной есть только 4 части. Так что это неправильно.

Ответы [ 3 ]

5 голосов
/ 16 октября 2011

Это попытается сопоставить ваши "части" как минимум 15 раз в строке.

    boolean foundMatch = false;
    try {
        foundMatch = subjectString.matches("(?:(?:ab(?:cd|efgjkln))|(?:(?:ef?jkln))){15,}");
    } catch (PatternSyntaxException ex) {
        // Syntax error in the regular expression
    }

Если есть хотя бы 15 повторений любой из вышеперечисленных частей, найденное соответствие будет истинным, в противном случае оно останется ложным.

Распределение:

"(?:" +                       // Match the regular expression below
   "|" +                         // Match either the regular expression below (attempting the next alternative only if this one fails)
      "(?:" +                       // Match the regular expression below
         "ab" +                        // Match the characters “ab” literally
         "(?:" +                       // Match the regular expression below
                                          // Match either the regular expression below (attempting the next alternative only if this one fails)
               "cd" +                        // Match the characters “cd” literally
            "|" +                         // Or match regular expression number 2 below (the entire group fails if this one fails to match)
               "efgjkln" +                   // Match the characters “efgjkln” literally
         ")" +
      ")" +
   "|" +                         // Or match regular expression number 2 below (the entire group fails if this one fails to match)
      "(?:" +                       // Match the regular expression below
         "(?:" +                       // Match the regular expression below
            "e" +                         // Match the character “e” literally
            "f" +                         // Match the character “f” literally
               "?" +                         // Between zero and one times, as many times as possible, giving back as needed (greedy)
            "jkln" +                      // Match the characters “jkln” literally
         ")" +
      ")" +
"){15,}"                      // Between 15 and unlimited times, as many times as possible, giving back as needed (greedy)
1 голос
/ 16 октября 2011

Как насчет этого:

(?:a(?:b(?:c(?:d)?)?)?ef(?:g(?:h(?:i)?)?)?jklmn){15,}

Объяснение: вы создаете группу без захвата (с (?: ... )) и говорите, что это должно быть повторено> = 15 раз, отсюда и фигурные скобки вконец.

0 голосов
/ 16 октября 2011

Во-первых, кажется, что ваш шаблон может быть упрощен.Действительно, шаблон a является подмножеством ab, которое является подмножеством abc, поэтому, если шаблон abc соответствует, это означает, что a также соответствует.Подумайте об этом и измените ваш шаблон соответствующим образом.Прямо сейчас это, вероятно, не то, что вы действительно хотите.

Во-вторых, чтобы повторить что-то, используйте паттерн {N}, то есть abc{5} означает "abc повторяется пять раз".Вы также можете использовать {3,}, {, 5}, {3,5}, что означает повторение> = 3, повторение <= 5, 3 <= повторение <= 5.</p>

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