Tengo problemas con la siguiente expresión regular que funciona en Safari, por lo que tengo que cambiar la forma en que me acerco a esta expresión regular. Necesito la siguiente expresión regular para seleccionar solo el texto entre: cp1= y | .
Por ejemplo, si tuviera esta cadena:
firstName=John|lastName=Smith|cp1=/en-gb/|age=30
Solo quiero obtener /en-gb/ y nada más.
El siguiente JS funciona a continuación en todos los navegadores que he probado excepto Safari:
// if myString = firstName=John|lastName=Smith|cp1=/en-gb/|age=30 let currentCP1Value = myString.match(/(?<=cp1=)(.*)(?=\|)|(?<=cp1=).*(?<!a)$/); // outputs /en-gb/Esto se debe a la búsqueda posterior positiva/negativa utilizada en la expresión regular. ¿Cuál sería la alternativa a esto para que funcione en Safari?
Sobre el patrón que probaste:
Esta parte del patrón (.*)(?=\|) Coincide hasta el final de la línea y luego retrocede hasta que puede afirmar un | a la derecha, que puede coincidir demasiado si hay varias apariciones de | siguiendo.
Esta parte del patrón |(?<=cp1=).*(?<!a)$ es la segunda alternativa, que también coincide hasta el final de la línea y afirma que no termina con a carácter a, lo que parece fuera de lugar como desea hacer coincidir /en-gb/ terminando en /
No necesita mirar alrededor para obtener /en-gb/ , puede usar un grupo de captura como ya está usando en su patrón.
Use una clase de carácter negado [^|]* para hacer coincidir cualquier carácter excepto | para no cruzarse con el siguiente.
\bcp1=([^|]*)Demostración de expresiones regulares
const myString = "firstName=John|lastName=Smith|cp1=/en-gb/|age=30" let currentCP1Value = myString.match(/\bcp1=([^|]*)/); if (currentCP1Value) { console.log(currentCP1Value[1]); }¿Por qué usar expresiones regulares en absoluto? Si sus datos no contienen texto que pueda interpretarse como segmentos codificados de URL, simplemente puede reemplazar | con & y ahora tiene una cadena de consulta estándar para la que JS tiene un análisis incorporado a través de URLSearchParams :
const parsed = new URLSearchParams(input.replaceAll(`|`, `&`)); const cp = parsed.get(`cp1`); // and many utility functions to perform further worky tu estas listo.