Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

296
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!