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:
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
(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
Esta es mi expresión regular actual:
/^([a-zäöüÄÖÜß\s\d.,-]+?)\s*([\d\s]+(?:\s?[-|+\/]\s?\d+)?\s*[az]?)?\s*(\d{5})\s*(.+)?$/imPrué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.
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.
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> .+ ) )? $ ~mxuiTenga 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).