Extension régulière de Javascript. *?

J'ai les expressions régulières suivantes:

var regEx = /^\W*(.*?)\W*$/; var regEx2 = /^\W*(.*)\W*$/; 
  1. Qu'est-ce que signifie (.*?) ? Quelle est la différence entre (.*?) Et (.*) ?
  2. Pourquoi regEx.exec("abc ") renvoie ['abc ', 'abc'] en Javascript?
  3. Pourquoi regEx2.exec("abc ") renvoie ['abc ', 'abc '] en Javascript?

  1. Ajouter ? Après quantifier * , + , {n,m} , etc. rend l'appariement réticent / paresseux, par opposition à la correspondance gourmande par défaut. C'est assez intuitif du nom. Gourmand signifie qu'il essaiera de faire correspondre autant que possible. Lazy signifie qu'il essaiera de faire correspondre le moins possible.

  2. Il n'y a pas de jeton non-word \W , alors \W* correspond à une chaîne vide. Alors (.*?) Correspondra autant que possible, mais en vérifiant si \W* peut correspondre à quelque chose. Donc (.*?) Va correspondre et capturer "abc" , et \W* (non-mot) correspondra à l'espace.

  3. Presque la même chose que ci-dessus, mais (.*) Mangera le plus possible et correspondra et capturera "abc " , et \W* sera laissé avec une chaîne vide, à laquelle il correspond.

Pour 2 et 3, le deuxième élément dans le tableau de retour est le texte saisi par le premier groupe de capture dans le regex. Le premier élément dans le tableau est le texte qui correspond à l'intégralité du regex.

Qu'est-ce que signifie (. *?)?

Associez un personnage à zéro ou plusieurs fois dans un groupe correspondant.

Pourquoi regEx.exec ("abc") renvoie ['abc', 'abc'] en Javascript?

Vous obtenez un membre du tableau pour chaque groupe correspondant. L'élément à l'index 0 est la correspondance entière, l'élément suivant provient du premier (et uniquement) groupe correspondant ci-dessus.

Pourquoi RegEx2.exec ("abc") renvoie ['abc', 'abc'] en Javascript?

Pour la même raison que ci-dessus, à l'exception de cette fois, la combinaison avide correspondra également à l'espace, de sorte que votre premier groupe de capture est identique à la correspondance complète dans ce cas.

D'accord, la chose la plus simple à faire en regardant les expressions régulières que je trouve est de les décomposer et d'écrire ce que chaque partie fait.

Alors prenez la première expression régulière /^\W*(.*?)\W*$/

 ^ Start of search string \W* Match a non-word character zero or more times ( Start of group .*? Match any character (except a line terminator) zero or more times but as few as possible ) End of group \W* Match a non-word character zero or more times $ End of search string 

La méthode exec recherche le texte et renvoie un tableau de chaînes (ou nul s'il échoue). La chaîne de l'élément 0 est la sous-chaîne associée à l'expression entière, les chaînes après cela sont celles qui correspondent aux groupes de capture individuels.

Donc, pour votre premier exemple, l'expression entière saisit "abc " mais le groupe (.*?) Capture "abc" et vous obtenez deux éléments dans votre tableau