Hay algunos casos de URL como a continuación.
(1) https://m.aaa.kr/category/outer/55/ (2) https://m.aaa.kr/category/inner/5/ (3) https://m.aaa.kr/product/jacket/3031/category/55/display/1/ (4) https://m.aaa.kr/product/shirts/30/category/5/display/1/Necesito la expresión regular correcta para capturar la parte "55" o "5" de esas URL.
Lo que probé fue /(?:\/category\/\w+)(\/category\/)|(\d+[^\/])/g
Sin embargo, esta expresión regular también captura el "3031" en el caso (3), "30" en el caso (4). Y no puede capturar "5" en los casos (2) y (4).
¿Cómo puedo arreglarlo para hacer lo correcto?
Tenga en cuenta que su expresión regular /(?:\/category\/\w+)(\/category\/)|(\d+[^\/])/g coincide con múltiples ocurrencias (debido a la bandera g ) del patrón que coincide con /category/ , luego uno o más caracteres de palabra y luego /category/ (capturado en el Grupo 1) o captura en el Grupo 2 uno o más dígitos y luego un carácter que no sea / . Este es definitivamente un patrón incorrecto, ya que solo desea hacer coincidir y capturar dígitos en el Grupo 2. Además, la primera alternativa no parece coincidir con nada significativo para usted, ya que no restringe la segunda alternativa.
Además, el uso de \w+ para hacer coincidir cualquier texto entre dos barras no suele ser eficaz, ya que las partes de la URL a menudo contienen - caracteres, que no son caracteres de palabras.
Entonces, lo que puedes usar es uno de
/\/category\/(?:[\w-]+\/)?(\d+)/ /\/category\/(?:[^\/]+\/)?(\d+)/ Tenga en cuenta que no hay una bandera g ya que todo lo que necesita es la primera coincidencia. Detalles :
\/category\/ - una cadena /category/(?:[\w-]+\/)? - una secuencia opcional de uno o más caracteres de palabras o guiones y luego un / (nota [^\/]+ coincide con uno o más caracteres que no sean / , y también un grupo que no captura que ayuda a mantener la estructura del objeto de coincidencia más simple)(\d+) - Grupo 1: uno o más dígitos.Vea la demostración de JavaScript:
const urls = ['https://m.aaa.kr/category/outer/55/','https://m.aaa.kr/category/inner/5/','https://m.aaa.kr/product/jacket/3031/category/55/display/1/','https://m.aaa.kr/product/shirts/30/category/5/display/1/'] const rx = /\/category\/(?:[\w-]+\/)?(\d+)/; for (const url of urls) { document.body.innerHTML += '"' + url + '" => "<b>' + (rx.exec(url) || ['',''])[1] + '</b>"<br/>'; }¿Qué tal capturar el primer dígito (o dígitos) directamente después de /category/ o /category/someothertext/
con: /\/category\/(\w+\/)?(\d+)/g
Puede probarlo en línea aquí: https://regex101.com/r/n4dj1r/1