Eu tenho esta expressão regular que extrai guid e alguns outros atributos como nome, tipo e versão. Reveja o regex para quaisquer otimizações e melhorias.

As strings estão sempre no padrão de

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

regex

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

Registros de teste

Extraia partes em negrito da string.

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

Resultado esperado:

  1. d40a4e4c-d6a3-45ae-98b3-924b31d8712a
  2. coleção
  3. conteúdo1
  4. 1520623346833

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

Saída esperada

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

Código

O idioma é F #, mas a regex funciona em C # também. Além disso, gostaria de usar o mesmo regex em Node.js, então gostaria que o regex fosse agnóstico de linguagem.

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" 

insira a descrição da imagem aqui

Comentários

  • código adicionado, a linguagem é c #, f # mas deve ser agnóstica de linguagem, eu uso no nodejs também, a regex deve ser genérica, nenhuma implementação de linguagem específica necessária.
  • Não ' t funciona para mim no regexr
  • funciona. i.stack.imgur.com/gyZnT.png

Resposta

TL; DR; lista de ajustes:

  • Suporte .NET RegEx para grupos de captura nomeados. faça uso deles.
  • Use a especificação do formato GUID.
  • Simplifique a recuperação com grupos de não captura.
  • Faça suposições explícitas em classes de caracteres. Prefira grupos de caracteres negados à correspondência não gananciosa

Proponho a seguinte expressão regular em vez disso:

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

Embora esta regex seja um pouco mais longa, ela corresponde a ambos os exemplos em 62 etapas (em oposição a 117). Isso pode parecer apenas uma pequena melhoria, mas não é tudo o que acontece:

Esta regex usa grupos de captura de nomes que permitem uma extração de padrões muito mais natural e clara. Em vez de acessar grupos por índices mágicos, você pode acessá-los por nome e a construção de matchEntity é realizada da seguinte forma:

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, mas não menos importante este regex também não corresponde às especificações GUID incorretas

Comentários

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *