Estoy tratando de crear una expresión regular para hacer coincidir las coordenadas de latitud / longitud. Para hacer coincidir un número de doble precisión que he usado (\-?\d+(\.\d+)?)
, e intenté combinarlo en una sola expresión:
^(\-?\d+(\.\d+)?),\w*(\-?\d+(\.\d+)?)$
Esperaba que esto coincidiera con un doble, una coma, quizás algo de espacio y otro doble, pero no parece funcionar. Específicamente, solo funciona si NO hay espacio, ni uno ni más. ¿Qué he hecho mal?
Éste coincidirá estrictamente con los valores de latitud y longitud que se encuentran dentro del rango correcto:
Partidos
No coincide
fuente
?:
sintaxis del grupo de captura, así como la polaridad de captura(^[-+]?(?:[1-8]?\d(?:\.\d+)?|90(?:\.0+)?)),\s*([-+]?(?:180(?:\.0+)?|(?:(?:1[0-7]\d)|(?:[1-9]?\d))(?:\.\d+)?))$
Estoy usando estos (formato decimal, con 6 dígitos decimales):
Latitud
Longitud
Aquí hay una esencia que prueba ambos, reportados aquí también, para facilitar el acceso. Es una prueba Java TestNG. Necesitas Slf4j, Hamcrest y Lombok para ejecutarlo:
fuente
En realidad, Alix Axel, la expresión regular anterior es incorrecta en latitud, la longitud varía el punto de vista.
Las mediciones de latitud varían de –90 ° a + 90 ° Las mediciones de longitud varían de –180 ° a + 180 °
Por lo tanto, la expresión regular que figura a continuación se valida con mayor precisión.
Además, según mi pensamiento, nadie debería restringir el punto decimal en latitud / longitud.
O para el objetivo C
fuente
99
paraLatitude
, mientras99
está fuera del intervalo de-90, +90
por lo válido.Desglose de expresiones regulares:
-?
# aceptar valores negativos^
# Inicio de cadena[0-9]{1,3}
# Match 1-3 dígitos (es decir, 0-999)(?:
# Intenta hacer coincidir ...\.
# un punto decimal[0-9]{1,10}
# seguido de uno a 10 dígitos (es decir, 0-9999999999))?
# ... opcionalmente$
# Fin de cadenafuente
Prueba esto:
Compruébalo en:
http://regexpal.com/
Pegue la expresión en el cuadro superior, luego ponga cosas como esta en el cuadro inferior:
Desglose de expresiones regulares:
Ahora, lo que NO hace es restringirse a este rango:
En cambio, se limita a este rango:
Pero el objetivo es principalmente dividir cada parte de la expresión.
fuente
Aquí hay una versión más estricta:
-90
-+90
-180
-+180
fuente
Pitón:
Latitud:
result = re.match("^[+-]?((90\.?0*$)|(([0-8]?[0-9])\.?[0-9]*$))", '-90.00001')
Longitud:
result = re.match("^[+-]?((180\.?0*$)|(((1[0-7][0-9])|([0-9]{0,2}))\.?[0-9]*$))", '-0.0000')
Latitude debería fallar en el ejemplo.
fuente
@ Macro-Ferrari. Encontré una manera de acortarlo, y sin mirar a la luz de todas las conversaciones recientes sobre motores regex
fuente
Creo que estás usando \ w (carácter de palabra) donde deberías estar usando \ s (espacio en blanco). Los caracteres de palabras generalmente consisten en [A-Za-z0-9_], por lo que excluye su espacio, que luego no coincide en el signo menos opcional o un dígito.
fuente
Esto funcionaría para un formato como este: 31 ͦ 37.4 'E
fuente
Rubí
Longitud -179.99999999..180
Latitud -89.99999999..90
fuente
Un método completo y simple en el objetivo C para verificar el patrón correcto de latitud y longitud es:
donde searchString es la entrada que el usuario ingresaría en el campo de texto respectivo.
fuente
PHP
Aquí está la versión de PHP (los valores de entrada son:
$latitude
y$longitude
):fuente
Puedes probar esto:
fuente
Prueba esto:
fuente
Prueba esto:
fuente