Comment rechercher une chaîne csv et renvoyer une correspondance en utilisant une expression rationnelle Javascript

StackOverflow https://stackoverflow.com/questions/1204485

  •  05-07-2019
  •  | 
  •  

Question

J'essaie d'extraire le premier droit d'utilisateur de la chaîne séparée par des points-virgules qui correspond à un modèle.

Les droits des utilisateurs sont stockés au format:      LAA; LA_1; LA_2; LE_3;

La chaîne est vide si l'utilisateur ne dispose d'aucun droit.

Jusqu'à présent, ma meilleure solution consiste à utiliser l'expression regex suivante dans l'instruction regex.replace:   . * ?; (LA _ [^;] *)?. *

(Le point d'interrogation à la fin du groupe sert à faire correspondre toute la ligne au cas où l'utilisateur n'aurait pas le droit et la remplace par une chaîne vide pour signaler qu'elle ne l'a pas.)

Cependant, cela ne fonctionne pas correctement si le droit recherché est en première position:    LA_1; LA_2; LE_3;

Il est facile de résoudre ce problème en ajoutant simplement un point-virgule au début de la ligne avant de remplacer l'expression régulière, mais ma question est de savoir pourquoi la expression régulière suivante ne lui correspond pas.

. *? (?: (?: ^ |;) (LA _ [^;] *))?. *

J'ai essayé de nombreuses autres expressions régulières pour trouver la solution, mais sans succès jusqu'à présent.

Était-ce utile?

La solution

Je ne suis pas sûr de bien comprendre votre question, mais en ce qui concerne les expressions régulières que vous utilisez, vous les compliquez trop sans aucune raison claire (du moins pas pour moi). Vous voudrez peut-être quelque chose comme:

function getFirstRight(rights) {
  var m = rights.match(/(^|;)(LA_[^;]*)/)
  return m ? m[2] : "";
}

Autres conseils

Vous pouvez simplement scinder la chaîne en premier:

function getFirstRight(rights)
{
    return rights.split(";",1)[0] || "";
}

Pour répondre à la question spécifique "Pourquoi la regex suivante ne lui correspond-elle pas?", l'un des problèmes réside dans la combinaison des éléments au début:

.*?

éventuellement suivi de:

^|;

Ce qui pourrait ressembler à dire, sautez tous les caractères supplémentaires jusqu'à ce que vous atteigniez le début ou un point-virgule. Mais vous ne pouvez rien ignorer et arriver plus tard au début (à moins que cela implique des nouvelles lignes dans une chaîne multiligne).

Quelque chose comme ça marche:

.*?(\bLA_[^;]).*

Signification, ignorez les caractères jusqu'à la limite de mot suivie de "LA_".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top