Come cercare una stringa CSV e restituire una corrispondenza usando una regex Javascript

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

  •  05-07-2019
  •  | 
  •  

Domanda

Sto provando a estrarre il primo diritto dell'utente da una stringa separata da punto e virgola che corrisponde a un modello.

I diritti degli utenti sono memorizzati nel formato:      LAA; LA_1; LA_2; LE_3;

La stringa è vuota se l'utente non ha alcun diritto.

La mia migliore soluzione finora è usare la seguente regex nell'istruzione regex.replace:   . * ?; (LA _ [^;] *)?. *

(Il punto interrogativo alla fine del gruppo ha lo scopo di abbinare l'intera riga nel caso in cui l'utente non abbia il diritto e sostituirlo con una stringa vuota per segnalare che non ce l'ha.)

Tuttavia, non funziona correttamente nel caso in cui il diritto cercato sia nella prima posizione:    LA_1; LA_2; LE_3;

È facile risolverlo semplicemente aggiungendo un punto e virgola all'inizio della riga prima di regex, ma la mia domanda è: perché la seguente regex non corrisponde?

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

Ho provato numerose altre espressioni regolari per trovare la soluzione, ma finora senza successo.

È stato utile?

Soluzione

Non sono sicuro di avere la tua domanda giusta, ma per quanto riguarda le espressioni regolari che stai utilizzando, le stai complicando eccessivamente senza una ragione chiara (almeno non per me). Potresti desiderare qualcosa del tipo:

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

Altri suggerimenti

Potresti semplicemente dividere prima la stringa:

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

Per rispondere alla domanda specifica " perché la seguente regex non corrisponde? " un problema è il mix di questo all'inizio:

.*?

seguito infine da:

^|;

Il che potrebbe essere come dire, salta eventuali caratteri extra fino a raggiungere l'inizio o un punto e virgola. Ma non puoi saltare nulla e poi in seguito arrivi all'inizio (a meno che non implichi newline in una stringa multilinea).

Qualcosa del genere funziona:

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

Significato, salta i caratteri fino a un limite di parole seguito da " LA_ " ;.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top