Cómo buscar una cadena CSV y devolver una coincidencia usando un regex de Javascript

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Estoy intentando extraer el primer derecho de usuario de una cadena separada por punto y coma que coincide con un patrón.

Los derechos de los usuarios se almacenan en formato:     LAA;LA_1;LA_2;LE_3;

La cadena está vacía si el usuario no tiene ningún derecho.

Mi mejor solución hasta ahora es usar la siguiente expresión regular en la declaración regex.replace:   .*?;(LA_[^;?*)?.*

(El signo de interrogación al final del grupo tiene el propósito de hacer coincidir toda la línea en caso de que el usuario no tenga el derecho y reemplazarlo con una cadena vacía para indicar que no la tiene).

Sin embargo, no funciona correctamente en caso de que el derecho buscado esté en la primera posición:   LA_1;LA_2;LE_3;

Es fácil solucionarlo simplemente agregando un punto y coma al principio de la línea antes de reemplazar las expresiones regulares, pero mi pregunta es: ¿por qué la siguiente expresión regular no coincide?

.*?(?:(?:^| ;)(LA_[^ ;?*))?*

He intentado muchas otras expresiones regulares para encontrar la solución pero hasta ahora sin éxito.

¿Fue útil?

Solución

No estoy seguro de haber acertado con tu pregunta, pero en lo que respecta a las expresiones regulares que estás utilizando, las estás complicando demasiado sin una razón clara (al menos no para mí). Es posible que desee algo como:

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

Otros consejos

Primero puedes dividir la cadena:

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

Para responder a la pregunta específica " ¿por qué la siguiente expresión regular no coincide? " ;, un problema es la combinación de esto al principio:

.*?

finalmente seguido por:

^|;

Lo que podría ser como decir, omita cualquier carácter adicional hasta que llegue al principio o al punto y coma. Pero no se puede omitir nada y luego llegar al principio (a menos que implique nuevas líneas en una cadena multilínea).

Algo así funciona:

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

Significado, omite caracteres hasta que aparezca un límite de palabra seguido de " LA_ " ;.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top