Как разделить повторяющиеся шаблоны в регулярных выражениях? - PullRequest
0 голосов
/ 16 января 2020

представьте, что есть строка из следующих строк:

" jack for { 123 for{}} rose for {}"

Я хочу разделить ее и получить эти две строки в качестве вывода:

jack   for { 123 for{}}   
rose for {} 

следующий шаблон регулярных выражений не решает проблему, и я сейчас не знаю, куда поместить жадный квантификатор:
[\S\s]*(for)\s*\{[\S\s]*}

любая помощь действительно будет цениться

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Я бы не использовал регулярные выражения для этой задачи и вместо этого реализовал бы простой синтаксический анализатор:

Scanner sc = new Scanner("  jack   for { 123 for{}} rose for {}");
sc.useDelimiter("");
List<String> resultingParts = new ArrayList<>();
int currentNestingDepth=0;
StringBuilder currentPart= new StringBuilder();
while (sc.hasNext()) {
    char c = sc.next().charAt(0);
    if (c == '{') { currentNestingDepth++; }
    else if (c == '}') {
        currentNestingDepth--; //!\\ might fail with unbalanced parens, test > 0 if needed

        if (currentNestingDepth == 0) { //we've reached the end of a part
            currentPart.append(c);
            resultingParts.add(currentPart.toString());
            currentPart = new StringBuilder();
            continue; // to avoid adding the current character yet again
        }
    }
   currentPart.append(c);
}
if (currentPart.length() > 0) { resultingParts.add(currentPart.toString()); }

Вы можете попробовать его здесь .

0 голосов
/ 16 января 2020

Если предположить, что внешние имена всегда являются "словами", а внутренняя строка - всегда числами, допустимое регулярное выражение будет:

\s*\w+\s*for\s*\{(\s*\d+\s*for\s*\{.*\})*\}

https://regex101.com/r/V3MNFd/1

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