J'essaie de faire correspondre plusieurs valeurs avec une seule expression régulière.

Je veux extraire l'indicateur et la valeur si elle est présente, mais je veux donner à l'utilisateur la possibilité de taper l'indicateur de plusieurs manières différentes.

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 '

Je veux pouvoir disséquer le drapeau et la valeur après =, après égal, il peut s'agir d'un seul mot ou de plusieurs valeurs séparées par une virgule entre guillemets simples ou doubles.

Voici ce que j'ai essayé

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

(en gras) est ce que j'essaie de faire correspondre, le groupe 1 serait le mot-clé et le groupe 2 serait la valeur de recherche qui est facultative.

Npm démarrer la recherche

Npm start recherche = chaîne de test

Npm démarrer la recherche = " tester "

Npm démarrer la recherche = ' tester '

Npm start search = " test, test-string "

Npm start search = ' test, test '

J'ai essayé d'utiliser l'antichambre négatif et derrière, mais je continue d'échouer ...

0
Shannon Hochkins 13 avril 2018 à 04:13

3 réponses

Meilleure réponse

Vous devez rendre l'option = facultative.

Si vous souhaitez autoriser des guillemets autour de la valeur, mais ne pas les inclure dans le deuxième groupe de capture, placez les guillemets avant le groupe de capture et rendez-les facultatifs. Ensuite, faites correspondre n'importe quoi, sauf les guillemets à l'intérieur du groupe de capture.

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

DEMO

Dans la démo, j'ai supprimé les guillemets des chaînes, car celles-ci sont analysées par le shell et ne sont pas transmises à npm. J'ai également dû mettre \n dans le [^] pour qu'il ne corresponde pas sur plusieurs lignes.

2
Shannon Hochkins 13 avril 2018 à 03:22

Ce qui suit devrait vous donner l'indicateur et la valeur après avoir supprimé les guillemets de la valeur:

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

Ou avec des citations

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

Si vous n'avez pas besoin de faire correspondre npm start simplement

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

N'ont pas encore testé pourrait avoir besoin de plus de peaufinage.

1
hard_working_ant 13 avril 2018 à 01:36

Essaye ça :

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

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

2
Mohammed Elhag 13 avril 2018 à 02:25