Cómo buscar una cadena CSV y devolver una coincidencia usando un regex de Javascript
-
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.
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_ " ;.