Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

299
Vistas
Regex grupos opcionales y longitud de dígitos

Tal vez algún regex-Master pueda resolver mi problema.

Tengo una gran lista con muchas direcciones sin separadores ( , ; ). La cadena de dirección contiene la siguiente información:

  • El primer grupo es el nombre de la calle.
  • El segundo grupo es el número de la calle.
  • El tercer grupo es el código postal (opcional)
  • El último grupo es el nombre de la ciudad (opcional)

regex_png

Como puede ver en la imagen de arriba, las dos últimas cadenas de prueba no coinciden. Necesito que los dos últimos grupos de expresiones regulares sean opcionales y el tercer grupo debe tener 4 o 5 dígitos.

Probé (\d{4,5}) para permitir 4 y 5 dígitos. Pero esto solo funciona a medias como puedes ver aquí: https://regex101.com/r/ZurqHh/1
Regex_4_5_dígitos (Esto a veces mezcla el número de la calle y el código postal)

También probé (?:\d{5})? para hacer que el tercer y cuarto grupo sean opcionales. Pero esto destruye todo el diseño de mi grupo... https://regex101.com/r/EgxeMy/1

regex_opcional

Esta es mi expresión regular actual:

 /^([a-zäöüÄÖÜß\s\d.,-]+?)\s*([\d\s]+(?:\s?[-|+\/]\s?\d+)?\s*[az]?)?\s*(\d{5})\s*(.+)?$/im

Pruébelo usted mismo: https://regex101.com/r/zC8NCP/1

Mi cerebro solo está tirando pedos en este momento y ya no puedo pensar con claridad.

Por favor, ayúdame a solucionar este problema para que pueda morir en paz.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Puedes usar

 ^(.*?)(?:\s+(\d+(?:\s*[-|+\/]\s*\d+)*\s*[az]?\b))?(?:\s+(\d{4,5})(?:\s+(.*))?)?$

Vea la demostración de expresiones regulares (tenga en cuenta que todos los \s se reemplazan con \h para que solo coincidan con los espacios en blanco horizontales).

Detalles :

  • ^ - comienzo de la cadena
  • (.*?) - Grupo 1: cero o más caracteres que no sean caracteres de salto de línea
  • (?:\s+(\d+(?:\s*[-|+\/]\s*\d+)*\s*[az]?\b))? - una coincidencia de grupo sin captura opcional
    • \s+ - uno o más espacios en blanco
    • (\d+(?:\s*[-|+\/]\s*\d+)*\s*[az]?\b) - Grupo 2:
      • \d+ - uno o más dígitos
      • (?:\s*[-|+\/]\s*\d+)* - cero o más secuencias de cero o más espacios en blanco, - , + , | o / , cero o más espacios en blanco, uno o más dígitos
      • \s* - cero o más espacios en blanco
      • [az]?\b - una letra ASCII minúscula opcional y un límite de palabra
  • (?:\s+(\d{4,5})\b(?:\s+(.*))?)? - una coincidencia de grupo sin captura opcional
    • \s+ - uno o más espacios en blanco
    • (\d{4,5}) - Grupo 3: cuatro o cinco dígitos
    • (?:\s+(.*))? - una secuencia opcional de uno o más espacios en blanco y luego cero o más caracteres que no sean caracteres de salto de línea tantos como sea posible
  • $ - final de la cadena.

Tenga en cuenta que el (?:\s+(.*))? el grupo opcional debe estar dentro de (?:\s+(\d{4,5})...)? grupo a trabajar.

over 4 years ago · Santiago Trujillo Denunciar

0

Es difícil analizar las direcciones porque estamos a medio camino entre el texto formateado y el lenguaje natural. Aquí hay un patrón que intenta en la medida de lo posible reducir la cantidad de parámetros opcionales para tener éxito con los ejemplos ofrecidos sin pedir demasiado al motor de expresiones regulares. Para hacer esto, me baso principalmente en clases de caracteres, grupos atómicos y una descripción relativamente precisa de los nombres de las calles. Obviamente, todos los ejemplos de la pregunta no pueden ser representativos de la realidad y se podrían agregar o quitar personajes de las clases para tratar nuevos casos. Sin embargo, la estructura de este patrón es un buen punto de partida.

 ~ ^ (?<strasse> [\pL\d-]+ \.? (?> \h+ [\pL\d-]+ \.? )*? ) \h* (?<nummer> \b (?> \d+ | [-+/\h]+ | [az] \b )*? ) (?: \h+ (?<plz> \d{4,5} ) \h+ (?<stadt> .+ ) )? $ ~mxui

manifestación

Tenga en cuenta que en el enlace anterior también puede ver una versión anterior de este patrón con una descripción más precisa del número de la calle (un poco más eficiente pero más larga).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda