Tengo el siguiente ejemplo de direcciones americanas.
6301 Stonewood Dr Apt-728, Plano TX-75024 13323 Maham Road, Apt # 1621, Dallas, TX 75240 17040 Carlson Drive, #1027 Parker, CO 80134 3465 25th St., San Francisco, CA 94110Quiero extraer la ciudad del uso de expresiones regulares.
Plano, Dallas, Parker, San Francisco
Estoy usando la siguiente expresión regular que funciona para el primer ejemplo
(?<=[,.|•]).*\s+(?=[\s,.]?CA?[\s,.-]?[\d]{4,})me puedes ayudar por lo mismo que?
Puedes usar
,(?:\s*#\d+)?\s*([^\s,][^,]*)(?=\W+[AZ]{2}\W*\d{4,}\s*$)Vea la demostración de expresiones regulares . El valor necesario está en el Grupo 1.
Detalles :
, - una coma(?:\s*#\d+)? - una secuencia opcional de cero o más espacios en blanco, # y luego uno o más dígitos\s* - cero o más espacios en blanco([^\s,][^,]*) - Grupo 1: un carácter que no sea espacio en blanco y coma y luego cero o más caracteres sin coma(?=\W+[AZ]{2}\W*\d{4,}\s*$) - una anticipación positiva que requiere (inmediatamente a la derecha)\W+ - uno o más caracteres que no son palabras[AZ]{2} - dos letras ASCII mayúsculas\W* - cero o más caracteres que no son palabras\d{4,} - gcuatro o más dígitos\s* - cero o más espacios en blanco$ - final de la cadena.Puede hacer coincidir la coma, luego todo excepto AZ y capturar desde la primera aparición de AZ.
,[^AZ,]*?\b([AZ][^,]*?),?\s*[AZ]{2}[-\s]\d{4,}\s*$Explicación
,[^AZ,]*?\b Haga coincidir una coma, luego cualquier carácter excepto AZ o una coma hasta un límite de palabra([AZ][^,]*?) Capture el grupo 1 Haga coincidir AZ y luego cualquier carácter excepto una coma lo menos posible,?\s*[AZ]{2} coincide con coma opcional, caracteres de espacio en blanco opcionales y 2 caracteres en mayúscula AZ[-\s]\d{4,}\s* Coincide con - o un carácter de espacio en blanco y luego 4 o más dígitos seguidos de caracteres de espacio en blanco opcionales$ final de cadenaLo mejor que pude adivinar fue comenzar desde el final de la cadena buscando una cadena de caracteres sin espacio (siendo la parte que está buscando) seguida de un espacio, una cadena de letras mayúsculas, luego una opción de espacio/guión y al final una cadena de números.
([^\s]+?)\,?\s[AZ]+[\s\-]?\d+$
Siendo el primer grupo, el target al que apuntas.
Este es un ejemplo en vivo con su caso de uso incrustado:
(como nota al margen, la demostración en regexr puede indicarle que la expresión tomó más de 250 ms y no se puede procesar... simplemente edite ligeramente el caso de prueba para que se actualice y le muestre el resultado real)