Tengo dos expresiones regulares con diferentes $1. En la primera parte, hay una barra inclinada antes de $1, pero no hay ninguna barra inclinada en la segunda parte. Entonces, ¿cómo combinarlos en una sola expresión?
const url = 'http://localhost////example///author/admin?query=1212'; clean_url = url.replace(/($|\?)/, "/$1").replace(/([^:]\/)\/+/g, "$1") console.log(clean_url)Dado que esta pregunta se refiere a @nuxtjs/redirect-module , puede usar varias redirecciones:
redirect: [{ from: '(.*)($|\?)(.*)', to: '$1/$2$3' }, { from: '(.*)([^:]\/)\/+(.*)', to: '$1$2$3' }]o una función de reemplazo
redirect: [{ from: '.*(?:(?:$|\?)|(?:[^:]\/\/+)).*', to: from => from.replace(/($|\?)/, "/$1").replace(/([^:]\/)\/+/g, "$1") }]Puedes usar
const url = 'http://localhost////example///author/admin'; clean_url = url.replace(/($|\?)|([^:]\/)\/+/g, (x,y,z) => z ? z : '/' + y); console.log(clean_url); // => http://localhost/example/author/admin/ La expresión regular ($|\?)|([^:]\/)\/+ coincide
($|\?) - Grupo 1 ( y ): final de la cadena o ?| - o([^:]\/)\/+ - cualquier carácter que no sea : y / (Grupo 2, z ), y luego una o más barras. Si el Grupo 2 coincide, el reemplazo es el valor del Grupo 2, de lo contrario, el reemplazo es / + el valor del Grupo 3.
No es posible simplemente "combinar" estas dos expresiones regulares, pero puede combinar las tareas, ya que ambas simplemente insertan un solo / con diferentes condiciones.
Puede combinar la lógica con mirar atrás (que puede no estar disponible en todos los navegadores todavía) y la expresión es una abominación y tendría cuidado con el rendimiento en producción; Pero es posible ;)
const url = 'http://localhost////example///author/admin?query=1212'; clean_url = url.replace(/(?<!\?.*)(?<![:\/])(?:\/+|\/*(?=\?)|\/*$)/g, "/") console.log(clean_url)