validate validar test regulares regular probar para longitud latitud expresiones expresion espacio ejemplos coordenadas blanco alfanumerico regex

regex - test - validar expresiones regulares javascript



¿Expresión regular para coincidir coordenadas de latitud/longitud? (16)

Éste ajustará estrictamente los valores de latitud y longitud que se encuentren dentro del rango correcto:

^[-+]?([1-8]?/d(/./d+)?|90(/.0+)?),/s*[-+]?(180(/.0+)?|((1[0-7]/d)|([1-9]?/d))(/./d+)?)$

Partidos

  • +90.0, -127.554334
  • 45, 180
  • -90, -180
  • -90.000, -180.0000
  • +90, +180
  • 47.1231231, 179.99999999

No coincide

  • -90., -180.
  • +90.1, -100.111
  • -91, 123.456
  • 045, 180

Intento crear una expresión regular para unir coordenadas de latitud / longitud. Para hacer coincidir un número de precisión doble que he usado (/-?/d+(/./d+)?) , (/-?/d+(/./d+)?) intenté combinar eso en una sola expresión:

^(/-?/d+(/./d+)?),/w*(/-?/d+(/./d+)?)$

Esperaba que esto coincidiera con un doble, una coma, quizás un poco de espacio, y otro doble, pero parece que no funciona. Específicamente, solo funciona si no hay espacio, ni uno ni más. ¿Qué he hecho mal?


Aquí hay una versión más estricta:

^([-+]?/d{1,2}[.]/d+),/s*([-+]?/d{1,3}[.]/d+)$

  • Latitud = -90 - +90
  • Longitud = -180 - +180

Creo que estás usando / w (carácter de palabra) donde deberías estar usando / s (espacio en blanco). Los caracteres de Word normalmente constan de [A-Za-z0-9_], por lo que excluye su espacio, que luego no puede coincidir en el signo menos o un dígito opcional.


El espacio en blanco es / s, no / w

^(/-?/d+(/./d+)?),/s*(/-?/d+(/./d+)?)$

Mira si esto funciona


En realidad, Alix Axel, por encima de la expresión regular, está mal en el punto de vista de la latitud y la longitud.

Las mediciones de latitud oscilan entre -90 ° y + 90 ° Las mediciones de longitud oscilan entre -180 ° y + 180 °

Por lo tanto, la expresión regular dada a continuación valida con mayor precisión.
Además, según mi pensamiento, nadie debería restringir el punto decimal en latitud / longitud.

^([-+]?/d{1,2}([.]/d+)?),/s*([-+]?/d{1,3}([.]/d+)?)$

O para el objetivo C

^([-+]?//d{1,2}([.]//d+)?),//s*([-+]?//d{1,3}([.]//d+)?)$


Encontré una manera de acortarlo, y sin mirar a la luz de todas las conversaciones recientes sobre los motores de regex

const LAT_RE = /^[+-]?(([1-8]?[0-9])(/.[0-9]{1,6})?|90(/.0{1,6})?)$/;

const LONG_RE = /^[+-]?((([1-9]?[0-9]|1[0-7][0-9])(/.[0-9]{1,6})?)|180(/.0{1,6})?)$/;


Estoy usando estos (formato decimal, con 6 dígitos decimales):

Latitud

^(/+|-)?(?:90(?:(?:/.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:/.[0-9]{1,6})?))$

Longitud

^(/+|-)?(?:180(?:(?:/.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:/.[0-9]{1,6})?))$

Here hay una esencia que prueba ambos, informados aquí también, para facilitar el acceso. Es una prueba Java TestNG. Necesita Slf4j, Hamcrest y Lombok para ejecutarlo:

import static org.hamcrest.Matchers.*; import static org.hamcrest.MatcherAssert.*; import java.math.RoundingMode; import java.text.DecimalFormat; import lombok.extern.slf4j.Slf4j; import org.testng.annotations.Test; @Slf4j public class LatLongValidationTest { protected static final String LATITUDE_PATTERN="^(//+|-)?(?:90(?:(?://.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?://.[0-9]{1,6})?))$"; protected static final String LONGITUDE_PATTERN="^(//+|-)?(?:180(?:(?://.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?://.[0-9]{1,6})?))$"; @Test public void latitudeTest(){ DecimalFormat df = new DecimalFormat("#.######"); df.setRoundingMode(RoundingMode.UP); double step = 0.01; Double latitudeToTest = -90.0; while(latitudeToTest <= 90.0){ boolean result = df.format(latitudeToTest).matches(LATITUDE_PATTERN); log.info("Latitude: tested {}. Result (matches regex): {}", df.format(latitudeToTest), result); assertThat(result, is(true)); latitudeToTest += step; } latitudeToTest = -90.1; while(latitudeToTest >= -200.0){ boolean result = df.format(latitudeToTest).matches(LATITUDE_PATTERN); log.info("Latitude: tested {}. Result (matches regex): {}", df.format(latitudeToTest), result); assertThat(result, is(false)); latitudeToTest -= step; } latitudeToTest = 90.01; while(latitudeToTest <= 200.0){ boolean result = df.format(latitudeToTest).matches(LATITUDE_PATTERN); log.info("Latitude: tested {}. Result (matches regex): {}", df.format(latitudeToTest), result); assertThat(result, is(false)); latitudeToTest += step; } } @Test public void longitudeTest(){ DecimalFormat df = new DecimalFormat("#.######"); df.setRoundingMode(RoundingMode.UP); double step = 0.01; Double longitudeToTest = -180.0; while(longitudeToTest <= 180.0){ boolean result = df.format(longitudeToTest).matches(LONGITUDE_PATTERN); log.info("Longitude: tested {}. Result (matches regex): {}", df.format(longitudeToTest), result); assertThat(result, is(true)); longitudeToTest += step; } longitudeToTest = -180.01; while(longitudeToTest >= -300.0){ boolean result = df.format(longitudeToTest).matches(LONGITUDE_PATTERN); log.info("Longitude: tested {}. Result (matches regex): {}", df.format(longitudeToTest), result); assertThat(result, is(false)); longitudeToTest -= step; } longitudeToTest = 180.01; while(longitudeToTest <= 300.0){ boolean result = df.format(longitudeToTest).matches(LONGITUDE_PATTERN); log.info("Longitude: tested {}. Result (matches regex): {}", df.format(longitudeToTest), result); assertThat(result, is(false)); longitudeToTest += step; } } }


Pitón:

Latitude: 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 debe fallar en el ejemplo.


Prueba esto:

(?<!/d)([-+]?(?:[1-8]?/d(?:/./d+)?|90(?:/.0+)?)),/s*([-+]?(?:180(?:/.0+)?|(?:(?:1[0-7]/d)|(?:[1-9]?/d))(?:/./d+)?))(?!/d)`


Prueba esto:

^(/()([-+]?)([/d]{1,2})(((/.)(/d+)(,)))(/s*)(([-+]?)([/d]{1,3})((/.)(/d+))?(/)))$

Compruébalo en:

http://regexpal.com/

Pegue la expresión en el cuadro superior, luego coloque cosas como esta en el cuadro inferior:

(80.0123, -34.034) (80.0123) (80.a) (980.13, 40) (99.000, 122.000)

Desglose de Regex:

^ # The string must start this way (there can''t be anything before). (/() # An opening parentheses (escaped with a backslash). ([-+]?) # An optional minus, or an optional plus. ([/d]{1,2}) # 1 or 2 digits (0-9). ( # Start of a sub-pattern. ( # Start of a sub-pattern. (/.) # A dot (escaped with a backslash). (/d+) # One or more digits (0-9). (,) # A comma. ) # End of a sub-pattern. ) # End of a sub-pattern. (/s*) # Zero or more spaces. ( # Start of a sub-pattern. ([-+]?) # An optional minus, or an optional plus. ([/d]{1,3}) # 1 to 3 digits (0-9). ( # Start of a pattern. (/.) # A dot (escaped with a backslash). (/d+) # One or more digits (0-9). )? # End of an optional pattern. (/)) # A closing parenthesis (escaped with a backkslash). ) # End of a pattern $ # The string must end this way (there can''t be anything after).

Ahora, lo que NO hace es restringirse a este rango:

(-90 to +90, and -180 to +180)

En cambio, simple se restringe a este rango:

(-99 to +99, -199 to +199)

Pero el objetivo principal es simplemente desglosar cada parte de la expresión.


Prueba esto:

^[-+]?(([0-8]//d|//d)(//.//d+)?|90(//.0+)?)$,/s*^[-+]?((1[0-7]//d(//.//d+)?)|(180(//.0+)?)|(//d//d(//.//d+)?)|(//d(//.//d+)?))$


Puedes intentar esto:

var latExp = /^(?=.)-?((8[0-5]?)|([0-7]?[0-9]))?(?:/.[0-9]{1,20})?$/; var lngExp = /^(?=.)-?((0?[8-9][0-9])|180|([0-1]?[0-7]?[0-9]))?(?:/.[0-9]{1,20})?$/;


esto funcionaría para un formato como este: 31 ͦ 37.4 ''E

^ [-]? / d {1,2} [] ͦ [] / d {1,2}.? / d {1,2} [] / x27 [] / w $


Rubí

Longitud -179.99999999..180

/^(-?(?:1[0-7]|[1-9])?/d(?:/./d{1,8})?|180(?:/.0{1,8})?)$/ === longitude.to_s

Latitude -89.99999999..90

/^(-?[1-8]?/d(?:/./d{1,8})?|90(?:/.0{1,8})?)$/ === latitude.to_s


/(-?/d{1,2}[.]/d+)(?U:.*)(-?1?[0-8]?/d[.]/d+)/


^-?[0-9]{1,3}(?:/.[0-9]{1,10})?$

Desglose de Regex:

^-?[0-9]{1,3}(?:/.[0-9]{1,10})?$

-? # aceptar valores negativos

^ # Inicio de cadena

[0-9]{1,3} # Coincide con 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 la cadena