Множественное совпадение регулярных выражений в строке

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

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

npm start search
npm start search=test-string
npm start search="test"
npm start search='test'
npm start search="test, test-string"
npm start search=' test,test '

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

вот что я пробовал

(^[^=]+)\=([^'"].*)?

(выделено жирным шрифтом) - это то, что я пытаюсь сопоставить, группа 1 будет ключевым словом, а группа 2 будет необязательным поисковым значением.

npm начать поиск

npm start search=тестовая строка

npm start search="test"

npm start search='test'

npm start search="test, test-string"

npm start search=' тест,тест '

Я пытался использовать отрицательный взгляд вперед и назад, но продолжаю терпеть неудачу...


person Shannon Hochkins    schedule 13.04.2018    source источник
comment
Является ли = необязательным?   -  person Barmar    schedule 13.04.2018
comment
Да, размер значения флага необязателен, флаг может быть без значения (=)   -  person Shannon Hochkins    schedule 13.04.2018
comment
У вас нет ? после =, так что это не обязательно.   -  person Barmar    schedule 13.04.2018
comment
Я знаю, но это не в группе совпадений, и первое совпадение будет соответствовать всем, пока не появится знак =   -  person Shannon Hochkins    schedule 13.04.2018
comment
Но совпадения вообще не будет, если = не совпадает, поэтому группа захвата не установлена.   -  person Barmar    schedule 13.04.2018
comment
Соответствует флагу regex101.com/r/4wGMF6/1, проблема I у меня нет это все после знака =   -  person Shannon Hochkins    schedule 13.04.2018
comment
О, извините, я вижу, что вы видите ^(^[^=\n]+)\=?, будет соответствовать всем флагам, теперь мне нужно выяснить все значения   -  person Shannon Hochkins    schedule 13.04.2018


Ответы (3)


Вам нужно сделать = необязательным.

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

^([^=\n]+)=?['"]?([^'"\n]*)

ДЕМО

В демонстрации я удалил кавычки из строк, так как они анализируются оболочкой и не передаются в npm. Мне также пришлось поместить \n в [^], чтобы он не совпадал в нескольких строках.

person Barmar    schedule 13.04.2018
comment
Привет, приятель, спасибо, мне определенно нужны примеры, которые я отправил, скрипт, который работает, происходит до запуска скрипта npm (глупая абстракция), поэтому мне определенно нужны как одинарные, так и двойные кавычки... - person Shannon Hochkins; 13.04.2018
comment
это самое близкое, что я нашел: regex101.com/r/zvphYw/1, но он по-прежнему соответствует одинарным кавычкам в группе 2 - person Shannon Hochkins; 13.04.2018
comment
Итак, вы пытаетесь проанализировать сценарий, содержащий команды npm, вы не делаете этого в Javascript, который запускается npm? - person Barmar; 13.04.2018
comment
В этом случае у вас не должно быть ^ в начале регулярного выражения, так как вы пытаетесь сопоставить вещи, которые не находятся в начале строки. - person Barmar; 13.04.2018
comment
Сначала он обрабатывается узлом, что трудно объяснить, я не включаю npm start в свои примеры как более простой пример для начала, его легко добавить позже. - person Shannon Hochkins; 13.04.2018
comment
Отлично, вот и все! Несмотря на то, что ваши примеры не содержат кавычек, они работают :) - person Shannon Hochkins; 13.04.2018

Попробуй это :

(?<=npm start)([^=\n]+)(?:=?)(?:['"]+)?([^\n\'\"]+)?(?:[^\S\n]?)

https://regex101.com/r/i0aacp/10/

person Mohammed Elhag    schedule 13.04.2018
comment
Это соответствует флагу и всем значениям в одной группе, а также соответствует кавычкам. regex101.com/r/4wGMF6/3 это близко, однако это все еще соответствует кавычкам - person Shannon Hochkins; 13.04.2018
comment
спасибо, это работает, однако версия @barmar намного чище - person Shannon Hochkins; 13.04.2018

Следующее должно дать вам флаг и значение после удаления кавычек из значения:

 myStr.match (/^npm start ([^\s]+)\s*=?\s*(['"]?[^'"]+?['"]?)\s*?$/i)

Или с кавычками

myStr.match (/^npm start ([^\s]+)\s*=?\s*([^\s]+)?\s*$/i)

Если вам не нужно просто сопоставлять npm start

  myStr.match (/\s*([^\s]+)\s*=?\s*([^\s]+)\s*?$/i)

Еще не проверял, возможно, потребуется дополнительная настройка.

person overflower    schedule 13.04.2018