Tengo esta expresión regular que extrae guid y un par de otros atributos como nombre, tipo y versión. Revise la expresión regular para ver si hay optimizaciones y mejoras.

Las cadenas siempre están en el patrón de

/publication/guid/type/name;version=1234 

expresión regular

(([a-f0-9]+\-)+[a-f0-9]+)\/(.*?)\/(.*?);version=(\d*) 

Registros de prueba

Extrae partes en negrita de la cadena.

/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/collection/content1;version=1520623346833

Resultado esperado:

  1. d40a4e4c-d6a3-45ae-98b3-924b31d8712a
  2. colección
  3. contenido1
  4. 1520623346833

/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/article/testContent;version=1520623346891

Salida esperada

  1. d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
  2. artículo
  3. testContent
  4. 1520623346891

Código

El idioma es F #, pero la expresión regular también funciona en C #. Además, me gustaría usar la misma expresión regular en Node.js, por lo que me gustaría que la expresión regular sea independiente del idioma.

let matchEntity (m: Match) = { id= m.Groups.[1].Value; eType = m.Groups.[3].Value; name= m.Groups.[4].Value; version = m.Groups.[5].Value} let regex = new Regex("(([a-f0-9]+\-)+[a-f0-9]+)\/(.*?)\/(.*?);version=(\d*)") matchEntity regex.Match "/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/collection/content1;version=1520623346833" 

ingrese la descripción de la imagen aquí

Comentarios

  • código agregado, el lenguaje es c #, f # pero debería ser independiente del lenguaje, yo también uso en nodejs, la expresión regular tiene que ser genérica, no se requiere implementación de lenguaje específico.
  • No ' t funciona para mí en regexr
  • funciona. i.stack.imgur.com/gyZnT.png

Respuesta

TL; DR; lista de ajustes:

  • .NET RegEx admite grupos de captura con nombre. hacer uso de ellos.
  • Hacer uso de la especificación de formato GUID.
  • Simplificar la recuperación con grupos que no capturan.
  • Hacer supuestos explícitos en las clases de caracteres. Prefiero grupos de caracteres negados a coincidencias no codiciosas

Propongo la siguiente expresión regular en su lugar:

(?<guid>[a-f0-9]{8}(?:\-[a-f0-9]{4}){3}\-[a-f0-9]{12})\/(?<type>[^\/]+)\/(?<name>[^;]+);version=(?<version>\d*) 

Si bien esta expresión regular es algo más larga, coincide con ambos ejemplos en 62 pasos (a diferencia de 117). Esto puede parecer solo una pequeña mejora, pero no es todo lo que sucede:

Esta expresión regular utiliza grupos de captura con nombre que permiten una extracción de patrones mucho más natural y clara. En lugar de acceder a los grupos mediante índices mágicos, puede acceder a ellos por nombre y la construcción de matchEntity se realiza de la siguiente manera:

let matchEntity (m: Match) = { id= m.Groups.["guid"].Value; eType = m.Groups.["type"].Value; name= m.Groups.["name"].Value; version = m.Groups.["version"].Value } 

Por último, pero no menos importante esta expresión regular también no coincide con especificaciones GUID incorrectas

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *