RegExp рекурсивный - PullRequest
       1

RegExp рекурсивный

0 голосов
/ 21 марта 2020

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

Вот мое регулярное выражение: ({) (\ n ([az -] ) :( [a-zA-Z0-9 #. '"()] ) \;) * (\ n}) И строка:

{
fill-color:#555;
fill-opacity:0.15;
fill-blend:'multiply';
}
{
stroke-color:#f90;
stroke-width:5pt;
stroke-opacity:0.2;
}
{
stroke-color:#f00;
stroke-width:0.5pt;
}
{
stroke-color:#f00;
}
]

И ссылка на reg101 для проверки: https://regex101.com/r/0dLyT4/2

С этим регулярным выражением у меня есть только последняя итерация.

match1 > fill-blend:'multiply';
match2 > stroke-opacity:0.2;
match3 > stroke-width:0.5pt;
match4 > stroke-color:#f00;

Что я должен изменить, чтобы соответствовать:

match1 > fill-color:#555;
match2 > fill-opacity:0.15;
match3 > fill-blend:'multiply';
match4 > stroke-color:#f90;
match5 > stroke-width:5pt;
match6 > stroke-opacity:0.2;
match7 > stroke-color:#f00;
match8 > stroke-width:0.5pt;
match9 > stroke-color:#f00;

Спасибо за ваше время!

Ответы [ 4 ]

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

Следующее регулярное выражение соответствует вашим критериям.

(?m)^\s*\w+[^:]+:[^;\n]+;

Вот ссылка https://regex101.com/r/Sy7nmh/1

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

Вы можете использовать одну группу захвата и повторить внутри нее группу без захвата (?:...)*. Повторите группу без захвата 1+ раз, чтобы избежать получения пустых совпадений.

Использование этого шаблона [a-z\-]*):([a-zA-Z0-9#.'"()]* с множителем * также позволит сопоставить один :.

Обратите внимание, что вам не нужно экранировать \-, так как это последний символ в классе символов, и \; не требует экранирования сам по себе.

\{\n((?:[a-z-]+:[a-zA-Z0-9#.'"()]+;\n)+)}

Regex demo

Если вы также не хотите перехватывать конечную новую строку, вы можете повторить группу без перехвата 0+ раз и сопоставить хотя бы один элемент, где последняя новая строка будет вне группы захвата.

\{\n((?:[a-z-]*:[a-zA-Z0-9#.'"()]+;\n)*[a-z-]*:[a-zA-Z0-9#.'"()]+;)\n}

Regex demo

0 голосов
/ 21 марта 2020

Вы можете попробовать это регулярное выражение. Это будет соответствовать всем CSS свойствам в group1.

{(\n+([a-z0-9#\.\-:'"]+;\n*)*)}

Здесь regex101 link

0 голосов
/ 21 марта 2020

Как regex101.com говорит:

Повторная группа захвата будет захватывать только последнюю итерацию. Поместите группу захвата вокруг повторяющейся группы, чтобы захватить все итерации, или вместо этого используйте группу без захвата, если вас не интересуют данные

Вот ваше регулярное выражение, исправленное с окружающей группой захвата: https://regex101.com/r/C7ANXp/1. Что вам нужно, это в группе 2.

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