Las coordenadas están en todas partes. Con expresiones regulares bien pensadas puedes validar que una latitud y longitud estén bien formadas en formato decimal o en grados, minutos y segundos (DMS), sin pelearte con rangos numéricos que pertenecen al lenguaje de programación. Aquí tienes patrones prácticos, trucos para CSV y un extra para direcciones de what3words.
¿Cómo validar latitud y longitud con expresiones regulares?
Validar con regex es validar la forma, no el contenido matemático. Así evitas falsos negativos y dejas la lógica de rango a tu lenguaje favorito, como JavaScript o PHP.
¿Por qué validar forma y no valor?
Diferencia clave: caracteres vs. valores.
La regex garantiza el formato correcto (signo, dígitos, separadores).
El lenguaje valida rango (ejemplo: 0–180 o 0–360). No lo fuerces en la regex.
Evita sobrevalidar: más mantenible y menos errores.
¿Qué patrón usar para formato decimal?
Coordenada individual con precisión entre 1 y 6 decimales, con signo opcional y punto obligatorio:
-?\d{1,3}\.\d{1,6}
Par lat, long con coma y posible espacio (útil en CSV), anclado a línea completa:
^-?\d{1,3}\.\d{1,6},\s?-?\d{1,3}\.\d{1,6}$
Cuando la línea trae más campos (ejemplo: altitud tras otra coma), puedes permitir el resto con comodín:
^-?\d{1,3}\.\d{1,6},\s?-?\d{1,3}\.\d{1,6},.*$
punto y coma del truco: usa .* si puede haber cero o más caracteres. .+ exigiría al menos uno.
espacios opcionales en CSV: \s? evita romper el parseo por “espacios de cortesía”.
anclajes ^ y $: aseguran que todo sea válido, no solo un fragmento.
¿Cómo construir regex para grados, minutos y segundos (DMS)?
El formato DMS es más legible: grados, minutos, segundos con centésimas, comillas correctas y punto cardinal. Recuerda: la regex valida la forma; el rango (0–60, etc.) lo valida el lenguaje.
¿Qué estructura debe cumplir DMS?
Estructura por coordenada: signo opcional, 1–3 dígitos de grados, espacio, 1–2 dígitos de minutos + comilla simple ', espacio, 1–2 dígitos de segundos + punto + exactamente 2 decimales, comilla doble ", espacio y punto cardinal.
Par DMS anclado, con coma intermedia y posible espacio. Primera coordenada con east/west y segunda con north/south:
comillas correctas: ' para minutos y " para segundos.
precisión fija en segundos: \d{2} para centésimas; si es 0, conserva 00.
error común: confundir [EW] con [NS] entre izquierda y derecha. Asegura el orden correcto.
¿Cómo asegurar líneas bien formadas?
usa anclajes ^...$ para que no “cuelen” letras en la cola.
si metes una letra en los números, la regex debe fallar, y si no falla, revisa tus clases de caracteres.
valores fuera de rango (p. ej., 354°) pueden pasar la regex, y está bien: el lenguaje hará esa validación numérica.
¿Cómo modelar direcciones what3words con regex?
what3words nombra cada cuadrado de 3×3 metros con tres palabras en minúsculas separadas por puntos. Para texto puro, evita atajos como \w porque incluyen dígitos y guion bajo.
¿Qué patrón capta tres palabras separadas por puntos?
Tres palabras con letras a-z, de 3 o más caracteres, separadas por puntos y ancladas:
^[a-z]{3,}\.[a-z]{3,}\.[a-z]{3,}$
Variantes útiles y equivalencias de cuantificadores:
equivalente a “tres o más” sin llaves: [a-z][a-z][a-z]+.
si la primera letra pudiera ser alfanumérica: ^[a-z0-9][a-z]{2,}\.[a-z]{3,}\.[a-z]{3,}$.
Consejos prácticos:
clases de caracteres explícitas evitan sorpresas: no uses\w aquí.
cuantificadores: + es uno o más; {3,} es “tres o más”. Ambas formas son válidas.
consistencia: decide un estilo y úsalo en todo el patrón.
¿Quieres que revisemos un patrón específico o un ejemplo real de tus datos? Compártelo en los comentarios y lo afinamos juntos.
Matemáticamente existen angulos mayores a 360°, No se como se llaman pero un ángulo de 450° es coterminal con un ángulo de 90°.
muestro una liga en Wolfram Alpha
Nótese que un ángulo de 450° (en particular), es equivalente a 7.854 radianes.
Y un video de YouTube:
Los ángulos mayores a 360°, tienen aplicaciones, y los Ingenieros en Comunicaciónes (Electrónicas), están familiarizadas con ellas. _
¡Esto no es en detrimiento del curso el cual es excelente.!_
Quizá se pueda decir “En el contexto del problema, el ángulo debe estar en el siguiente intervalo [a,b]”
Se me ocurrió la siguiente expresión regular permitiría hacer testear ángulos entre -360° y 360°
^-?(360|3[0-5]\d|[12]?\d{2}|\d)$
Pero, como sugiere @beco, el trabajo de validación semántica del dato debería dejársele al programa y no a la expresión regular.
Pero no quita la idea que con las expresiones regulares permiten buscar y esa expresion relativamente esta bien para eso. La idea esta excelente.
🔹 No es trabajo de las expresiones regulares determinar si un valor es correcto, de eso se encarga el lenguaje de programación. Las expresiones regulares determinan si tiene la forma correcta.
Latitud y longitud:
-?\d{1,3}\.\d{1,6},\s?-?\d{1,3}\.\d{1,6}
Latitud, longitud y metros sobre el nivel del mar:
👉 Super tip: puede pasar que al trabajar con csv, se tengan espacios entre columnas. Para evitar problemas añadir un \s? a la expresión regular.
Good!
Seguramente en vez de restringir a WE y NS sería mejor dejar los caracteres [a-zA-Z]. Primero por si hay alguna línea del CSV que esté en minúsculas, y segundo porque quizá es un csv construido desde diferentes fuentes de datos y algunos estén en otros idiomas. Quizá mezcla español e inglés y la notación WE nos impediría acceder a los datos en español, porque sería OE.
Me parece que internacionalmente N, S, W, E son los estándares de los puntos cardinales.
Yo los configuré como [NnOoWwSsEe] y así tiene en cuenta ambos idiomas.
Hay un error conceptual, si en las coordenadas se usa NS y WE no se debe indicar el signo - ya que esta implicito en la definición, esto nada tiene que ver con el tema de la clase que es muy interesante, es solo una precisión a nivel de información geográfica
latitud va de 0 a 90 positivo en el hemisferio norte o negativo en el hemisferio norte. Longitud va de 0 a 180 positivo al este de Greenwich y negativo al oeste. Solo por estar claros con los valores y su contexto
Las expresiones regulares nos ayudan a checar que la cadena que estamos buscando tenga la estructura deseada, más no checara si es una palabra valida o no.
Es decir, queremos validar la palabra "perro", pero solo usamos
[\w]{5}, entonces, nuestra ER encontrara todos los que cumplan con eso, bien puede ser Perro que es la palabra valida o pepsi que no es valida pero si tiene una longitud de 5.
No se haya alguien aqui con vida aun pero tengo una confusion con los "[ ]" y los "( )", cual es la diferencia del uso de ambos?
Por mi parte intente recrear la primera expresion por el minuto 6:07 de la siguiente manera ^([-]?\d{1,3}[.]\d{2,6},\s?){2,2}.*$ usando los "( )". No se si es una mala practica o simplemente el profesor nos los usa para intentar hacer la expresion mas humanamente legible.
Los paréntesis agrupan expresiones (clases y caracteres) para, si hay match, usar el contenido de dicho match posteriormente, generalmente como $1, $2,...
Los corchetes sirven para crear clases de caracteres [a-z] equivale a un caracter que sea entre la a y la z
Respecto al tercer ejemplo, tuve que hacer una pequeña modificación, ya que la página
me muestra palabras en español con tildes, así que las agregué como posibilidades dentro de
las palabras.
^[a-záéíóú]{3,}\.[a-záéíóú]{3,}\.[a-záéíóú]+$
Expresión Regular 1:
^\-?\d{1,3}\.\d{1,6},\s?\-?\d{1,3}\.\d{1,6},.*$
Desglose:
^ → Indica que la coincidencia debe empezar al inicio de la línea.
\-? → Coincide con un signo negativo (-) opcional, lo que permite valores positivos y negativos.
\d{1,3} → Coincide con entre 1 y 3 dígitos para los grados (ejemplo: 99, 9, 123).
\. → Coincide con un punto decimal (.).
\d{1,6} → Coincide con entre 1 y 6 dígitos después del punto decimal, representando la parte fraccionaria de la coordenada.
, → Coincide con una coma (,).
\s? → Coincide con un espacio opcional después de la coma.
\-?\d{1,3}\.\d{1,6} → Coincide con otro valor de latitud o longitud (misma estructura que el primero).
, → Coincide con otra coma (,).
.* → Coincide con cualquier otro contenido adicional después de la segunda coordenada, permitiendo información extra (como altitud).
$ → Indica que la coincidencia debe terminar al final de la línea.
¿Qué captura?
Esta expresión regular identifica coordenadas en formato decimal (grados decimales), opcionalmente seguidas por datos adicionales (como altitud).
Ejemplos (Coincidencias):
✅ -99.205646,19.429707,2275.10✅ -99.205581,19.429652,2275.10✅ -99.204654, 19.428952,2275.58 (permite espacio opcional después de ,)
Contraejemplos (No coincide):
❌ -99 12' 34.08"W, 19 34' 56.98"N → Este es un formato en grados, minutos y segundos (DMS), que no es compatible con esta expresión regular.❌ -34 54' 32.00"W, -3 21' 67.00"S → También es un formato DMS, por lo que no coincide.❌ -354 54' 32.00"W, -399 21' 67.00"S → No es válido porque los valores de longitud superan ±180 y los de latitud superan ±90.
❌ -99.205646,19.429707,2275.10 → Este es un formato en grados decimales, no en DMS.❌ -354 54' 32.00"W, -399 21' 67.00"S → No es válido porque la longitud supera ±180 y la latitud supera ±90.❌ -34 54' 32.00"N, -3 21' 67.00"E → El formato es correcto, pero "E" en latitud es inválido (la latitud sólo puede ser "N" o "S").
Excelente aporte! Te añado que en vez de poner individualmente los puntos (.), se deben escapar (.) porque son caracteres especiales.
Esta sería una versión simplificada del tuyo:
^([a-zñÑáéíóúÁÉÍÓÚ]{3,}\.?){3}$
¿Siempre que ponga el cursor en el mismo punto del sitio web de 3 palabras aleatorias, siempre serán aleatorias?
Según lo que pude ver son aleatorias pero en diferentes puntos no en el mismo ya que en este las palabras que se generan son las mismas.
Cada espacio de 3mt x 3mt en el mundo ya tiene asignadas sus tres palabras, aunque vuelvas a colocarte en la misma ubicación que estabas va verse esas mis 3 palabras, ya no cambiaran jamas.
tengo la duda de como usar los [] y () tipo ? con [] me toma individualmente los caracteres colocados y con () se toma todos de una sola vez ?
Así es, y además cuando usas [] estás definiendo una clase, lo que quiere decir que va a buscar cada carácter de manera individual, mientras que con () los va a buscar juntos y en el orden especificado.
Alguien sabe por qué en VS code no funciona el escape del guión - y en otros editores como sublime sí?
En mi caso yo no he tenido ningún problema con las expresiones regulares en VSCOde :thinking:
Hola Luis! Estaba haciendo la expresión regular para encontrar coordenadas, cuando escapo el guion (-) me aparece este error. La misma expresión la usé en sublime y no hubo problema
como hago para que me aceptes los caracteres de utf-8 en mi expresiones regulares?
algunos debes escaparlos como ya se ha visto usando \ (backslash)
Puedes escribir \u005E, teniendo en cuenta que 005E es el código hexadecimal del símbolo unicode que quieras usar.
¡Saludos!
Para extraer coordenadas con expresiones regulares primero tenemos que entender que las REGEX no pueden comprobar si las coordenadas son validas, lo unico que podemos hacer es averiguar si una linea cumple el formato de coordenada. Para eso podemos usar la siguiente expresion para coordenadas digitales: ^(-?[\d]{1,3}.[\d]{1,6},\s?){2}.*$
O la siguiente para coordenadas impresas: ^-?\d{1,2} \d{1,2}' \d{1,2}.\d{2}"[EW],\s?-?\d{1,2} \d{1,2}' \d{1,2}.\d{2}"[NS]$