Spanish Ayuda con Regex

carlos7000

Well-Known Member
Licensed User
Longtime User
Hola a todos

Los regex nunca los he entendido completamente. Esta tarde he leído bastante sobre ellos y he visto varios videos pero ninguno me funciona.

Estoy tratando de crear una función que me retorne True o False si el dato recibido es valido para ser procesado.

Este es el datos con los que debería dar True son

https://www.google.com/maps?q=4.703274,-74.130271

En otras palabras la primera parte siempre es "https://www.google.com/maps?q=" y a continuación deben haber dos números decimales separados por una ',' que pueden tener una cantidad variable de decimales

Cree 2 regex pero ninguno funciona :
"^https:\/\/www\.google\.com\/maps\?q=-?\d+\.\d+,-?\d+\.\d+$"
"^(http(s)?://)?maps.google.com/maps\?q=([-+]?\d{1,2}\.\d+),([-+]?\d{1,3}\.\d+)$"

Escribí esta función para probarlos:

B4X:
Sub CheckIfGoogleMapsUrl(url As String, pattern As String) As Boolean
    Dim isMatch As Boolean = Regex.IsMatch(url, pattern)
    Return isMatch
End Sub

Al probar la función con esta otra, siempre da False.

B4X:
Sub TestCheckURL
  
    Dim url1 As String = "https://www.google.com/maps?q=4.703274,-74.130271"
    Dim url2 As String = "https://www.google.com/maps?q=40.7128,-74.0060"
    Dim url3 As String = "https://www.example.com"

  
    Dim pattern As String
    pattern = "^https:\/\/www\.google\.com\/maps\?q=-?\d+\.\d+,-?\d+\.\d+$"
    Log("URL 1 Match: " & CheckIfGoogleMapsUrl(url1, pattern))
    Log("URL 2 Match: " & CheckIfGoogleMapsUrl(url2, pattern))
    Log("URL 3 Match: " & CheckIfGoogleMapsUrl(url3, pattern))
End Sub

El los primeros 2 test debería dar True

Trate de hacer otra función validar los datos cuando llegan en un formato como este "4.703274,-74.130271" con el siguiente regex ^[-]?\d+(\.\d+)?,[-]?\d+(\.\d+)?$ y este otro regex (-?\d+\.\d+),(-?\d+\.\d+) pero tampoco me funciona

con este otro formato...

https://www.google.com/maps/place/4°42'11.8"N+74°07'49.0"W/@4.703274,-74.1328459,17z/data=!3m1!4b1!4m4!3m3!8m2!3d4.703274!4d-74.130271?entry=ttu

...ni lo intente, porque se que no lo lograré.

En el caso del ultimo, debe comenzar por https://www.google.com/maps/place/ y contener 2 decimales separados por ',' los decimales están precedidos por '@'
 
Last edited:

epiCode

Active Member
Licensed User
pattern = "^https:\/\/www\.google\.com\/maps\?q=\-?\d+\.\d+,\-?\d+\.\d+$"
 

carlos7000

Well-Known Member
Licensed User
Longtime User
Captura.JPG


No funcionó
 

epiCode

Active Member
Licensed User
B4X:
Sub CheckIfGoogleMapsUrl(url As String, pattern As String) As Boolean
    Dim m As Matcher = Regex.Matcher2( pattern, Regex.CASE_INSENSITIVE,url)
    Return m.Find
End Sub
 

drgottjr

Expert
Licensed User
Longtime User
el asunto es mas complicado

in primer termino, que las coordinadas sean validas no quiere decir
que son correctas. el usuario podia haber teclado la longitud y la
latitud al reves, o sea, longitud primera, dando lugar posiblemente a
unas coordinadoras validas pero incorrectas.


las coordinadas son ambas validas, pero se refieren a puntos muy distintos (si estas preparando la maleta para
un viaje)

segundo, valores validos para la latitud son aproximadamente 85
hasta -85, y para la longitud 180 hasta -180. habra que incluirse
pruebas aptas.

tercero, el segundo formato para coordinadoras no es facil de
analilzar debido - entre otras razones - al uso de simbolos especiales y
la falta de un sencillo "-" para indicar oeste o sur (segun)

aqui tienes la regla (regex) que utilizo para ese formato. la hice en javascript, pero te dara una idea
como proceder:
/^(\d{1,3})\D ?(\d{1,2})\D ?([0-9.]+?)\D ?([NSEW]),? *?(\d{1,3})\D ?(\d{1,2})\D ?([0-9.]+?)\D ?([NSEW])/

pero el regex es lo de menos. ademas de sacar grados, minutos y segundos, tendras que
validar los datos (o sea posibles valores validos para grados, minutos y segundos). y manejando "[NSEW]" de
por si solo es un ejercicio interesante.

y despues de hacer esto, hay formulas para convertir grados + minutes + segundos a las coordinadas utilizadas
por una persona normal para localizar un punto en el mapa. nadie va a teclar este format (el simbolo para grados no
se encuentra en los teclados que yo he visto).
 

carlos7000

Well-Known Member
Licensed User
Longtime User
B4X:
Sub CheckIfGoogleMapsUrl(url As String, pattern As String) As Boolean
    Dim m As Matcher = Regex.Matcher2( pattern, Regex.CASE_INSENSITIVE,url)
    Return m.Find
End Sub

La función y el regex de epiCode funcionaron.

Muchas gracias.
 
Last edited:

carlos7000

Well-Known Member
Licensed User
Longtime User
Me gustaría, si alguien me puede ayudar con un regex para esta cadena de texto:

https://www.google.com/maps/place/4°42'11.8"N+74°07'49.0"W/@4.703274,-74.1328459,17z/data=!3m1!4b1!4m4!3m3!8m2!3d4.703274!4d-74.130271?entry=ttu

Pero al pasar esa cadena a una variable, atomaticamente se convierte en

7636534.JPG

Me toco pegar el texto como imagen porque al escribir el texto, el algoritmo del foro lo convierte en esto


Con respecto a esta cadena lo que necesito es validar que contiene 2 números decimales después de '/@', separados por una ','
 

Attachments

  • 1692409045018.png
    1692409045018.png
    6.5 KB · Views: 58
Last edited:

angel_

Well-Known Member
Licensed User
Longtime User
Me gustaría, si alguien me puede ayudar con un regex para esta cadena de texto:

https://www.google.com/maps/place/4°42'11.8"N+74°07'49.0"W/@4.703274,-74.1328459,17z/data=!3m1!4b1!4m4!3m3!8m2!3d4.703274!4d-74.130271?entry=ttu

Pero al pasar esa cadena a una variable, atomaticamente se convierte en

View attachment 144918
Me toco pegar el texto como imagen porque al escribir el texto, el algoritmo del foro lo convierte en esto


Con respecto a esta cadena lo que necesito es validar que contiene 2 números decimales después de '/@', separados por una ','
Prueba así (obtenido de chatgpt):

B4X:
Dim url As String = $"https://www.google.com/maps/place/4°42'11.8"N+74°07'49.0"W/@4.703274,-74.1328459,17z/data=!3m1!4b1!4m4!3m3!8m2!3d4.703274!4d-74.130271?entry=ttu3"$
Dim pattern As String = "@(-?\d+\.\d+),(-?\d+\.\d+)"

Dim matcher1 As Matcher = Regex.Matcher(pattern, url)

If matcher1.Find Then
    Dim latitude As String = matcher1.Group(1)
    Dim longitude As String = matcher1.Group(2)
    Log("Latitude: " & latitude)
    Log("Longitude: " & longitude)
Else
    Log("No match found.")
End If
 

angel_

Well-Known Member
Licensed User
Longtime User
Descubrí que podía extraer la información que deseo empleando el método 'Match'. En la ayuda dice que Match es de solo lectura y retornara un texto conteniendo el texto encontrado. Al tratar de extraer el texto el programa se quiebra.

View attachment 144917
B4X:
Sub CheckIfGoogleMapsUrl(url As String, pattern As String) As Boolean
    Dim m As Matcher = Regex.Matcher2( pattern, Regex.CASE_INSENSITIVE,url)
    If m.Find then Log(m.Match)
    Return m.Find
End Sub
 

carlos7000

Well-Known Member
Licensed User
Longtime User
Prueba así (obtenido de chatgpt):

B4X:
Dim url As String = $"https://www.google.com/maps/place/4°42'11.8"N+74°07'49.0"W/@4.703274,-74.1328459,17z/data=!3m1!4b1!4m4!3m3!8m2!3d4.703274!4d-74.130271?entry=ttu3"$
Dim pattern As String = "@(-?\d+\.\d+),(-?\d+\.\d+)"

Dim matcher1 As Matcher = Regex.Matcher(pattern, url)

If matcher1.Find Then
    Dim latitude As String = matcher1.Group(1)
    Dim longitude As String = matcher1.Group(2)
    Log("Latitude: " & latitude)
    Log("Longitude: " & longitude)
Else
    Log("No match found.")
End If

En este momento no puedo probar el código, ya que el proyecto lo tengo en otro computador.

Muchas gracias por su ayuda
 
Top