Funciona en Chrome, pero falla en Safari: expresión regular no válida: nombre del especificador de grupo no válido /(?<=\/)([^#]+)(?=#*)/
En mi código Javascript, esta expresión regular /(?<=\/)([^#]+)(?=#*)/
funciona bien en Chrome, pero en Safari obtengo:
Expresión regular no válida: nombre del especificador de grupo no válido
¿Algunas ideas?
Parece que Safari aún no admite la búsqueda hacia atrás (es decir, tu (?<=\/)
). Una alternativa sería colocar el /
que viene antes en un grupo no capturado y luego extraer solo el primer grupo (el contenido después y /
antes del #
).
/(?:\/)([^#]+)(?=#*)/
Además, (?=#*)
es extraño: probablemente desee buscar algo (como #
el final de la cadena) en lugar de un *
cuantificador ( cero o más apariciones de #
). Quizás sería mejor usar algo como
/(?:\/)([^#]+)(?=#|$)/
o simplemente omitir la anticipación por completo (porque es ([^#]+)
codicioso), dependiendo de sus circunstancias.
Regex ?<=
no es compatible con Safari iOS, podemos usar ?:
Nota: /
o la primera letra de referencia que viene antes en un grupo no capturado
Ver detalle: https://caniuse.com/js-regexp-lookbehind
let str = "Get from Slash/to Next hashtag #GMK"
let workFineOnChromeOnly = str?.match(/(?<=\/)([^#]+)(?=#*)/g)
console.log("❌ Work Fine On Chrome Only", workFineOnChromeOnly )
let workFineSafariToo = str?.match(/(?:\/)([^#]+)(?=#*)/g)
console.log("✔️ Work Fine Safari too", workFineSafariToo )
Safari agregó soporte retrospectivo en 16.4.
https://developer.apple.com/documentation/safari-release-notes/safari-16_4-release-notes#JavaScript
El soporte para RegExp mira detrás de las afirmaciones emitidas por el kit web:
Consulte el enlace: https://github.com/WebKit/WebKit/pull/7109