Попытка сопоставить почти повторяющийся шаблон в Java - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь сопоставить очень специфический шаблон для моего универа. К сожалению, я застрял. Шаблон идет следующим образом:

  • Слово или число длиной 1 или 2, за которым следует ,.
  • Это повторяется четыре раза, а затем следует ; вместо ,.
  • Все это повторяется ровно четыре раза, но без ; в конце.

Примеры будут:

SR,SR,SR,AR;0,11,22,33;SG,1,23,DG;SY,BY,CY,DY
36,AR,CR,DR;SB,10,16,22;SG,13,BG,DG;SY,0,20,BY

Принимая во внимание, что они не должны совпадать (ищите запятые и точки с запятой):

SR,SR;SR,AR;0,11,22,33;SG,1,23,DG;SY,BY,CY,DY
36,AR,CR,DR,SB,10,16,22;SG,13,BG,DG;SY,0,20,BY

Самое близкое, что у меня есть

((([ABCDS][RBGY])|\d{1,2})[,;]){16}

Но это соответствует отрицательным примерам выше.

Это мой текущий обходной путь:

public boolean matching(String arguments) {
    String[] strings = arguments.split(";");
    if (strings.length != 4) return false;
    for (String s : strings) {
        String[] strings1 = s.split(",");
        if (strings1.length != 4) return false;
        for (String s1 : strings1) {
            if (!s1.matches(POSITION_PATTERN)) return false;
        }
    }
    return true;
}

Однако это не идеальное решение и очень неэффективное.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Ваше описание шаблона не соответствует вашим образцам данных. Я подозреваю, что вы имеете в виду группы букв, которые будут повторяться четыре раза, верно?

Простой может выглядеть так: ((\w{1,2}(,|(?:\w))){4}(;|$)){4}

Он просто делает шаг за шагом то, что вы просили.
См ДЕМО

0 голосов
/ 25 января 2019

Вы можете попробовать использовать следующий шаблон:

(?:[ABCDS][RBGY]|\d{1,2})(?:,(?:[ABCDS][RBGY]|\d{1,2})){3}(?:;(?:[ABCDS][RBGY]|\d{1,2})(?:,(?:[ABCDS][RBGY]|\d{1,2})){3}){3}

Объяснение:

(?:[ABCDS][RBGY]|\d{1,2})          match two letter or 1-2 digits
(?:,(?:[ABCDS][RBGY]|\d{1,2})){3}  followed by a comma and another two letters or
                                   1-2 digits, that quantity 3 times
(?:;                               then match semicolon
    (?:[ABCDS][RBGY]|\d{1,2})(?:,(?:[ABCDS][RBGY]|\d{1,2})){3}){3}
                                   followed by the previous pattern 3 more times

Демо

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