2017-01-18 3 views
1

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

(?<set>(?<field>(.+))\s*\,\s*(?<Type>(.+))\s*\,\s*(?<value>(\?))) 

Это работает для этой строки

FIELD1,INTEGER,? 

Как развернуть регулярное выражение для проверки повторяющихся наборов, таких как

FIELD1,INTEGER,?,FIELD2,INTEGER,?,FIELD1,STRING,? 
+0

Wrap текущего регулярного выражения в скобках и используйте '+!'? например '(текущее регулярное выражение) +'? –

ответ

0

Сначала избавьтесь от пары эти группы (в ваших названных группах захвата) вам нужно сделать регулярное выражение немного более понятным. Затем добавьте ? в + в ваши названные группы захвата, чтобы они не были жадными. Также необходимо добавить необязательный , и квантификатор для всего комплекта, чтобы группа могла повторяться несколько раз по мере описания.

    1     2       3 4 
        v     v      vvvvvv vv 
(?<set>(?<field>.+?)\s*\,\s*(?<Type>.+?)\s*\,\s*(?<value>\?)(?:[,]*))+? 
  1. Удалены вашу группу захвата и добавил ленивый квантор: (?<field>(.+)) ->(?<field>.+?)
  2. То же, что и выше, но для типа: (?<Type>(.+)) ->(?<Type>.+?)
  3. Добавлен опциональный без захвата группы: (?:[,]*) (вам не нужно [] его просто для чистоты)
  4. Шаблон может повторяться 1 или более раз с ленивым квантором: +?

См https://regex101.com/r/USM9lP/1 для полного примера

+0

Удивительный, спасибо. Веб-сайт, на который вы ссылались, был тем же сайтом, который я использую для тестирования. Это отличный ресурс. Сначала, когда я вырезал/вставлял ваше выражение, он выделял только первую группу. Я следил за вашей ссылкой и заметил, что опция/g была отмечена для вас. Я не знал об этом, и это все изменило. Спасибо – user3019436

+0

Последний вопрос, если бы я хотел, чтобы все выражение вышло из строя, если все условия не были выполнены для всех групп, как бы это сделать? – user3019436

+0

Выяснил это. Я добавил^и $ – user3019436

Смежные вопросы