【问题标题】:Rails regex for validation of Google Maps latitude longitude用于验证 Google Maps 纬度经度的 Rails 正则表达式
【发布时间】:2011-03-12 04:46:35
【问题描述】:

我正在尝试对从 Google Maps API 传回的 latlng 对象执行 validates_format_of。我已经完美地设置了地图,因此当我单击地图中的一个点时,它会用 latlng 填充一个文本字段(如下所示:46.320615137905904、9.400520324707031)。我将此值作为字符串存储在数据库中(然后我将其解析为稍后在地图上放置标记),但我需要将刺痛的格式验证为两个浮点数(正数或负数),中间有一个逗号。

我知道这可以通过正则表达式实现,但我一生都无法弄清楚正则表达式字符串以使其正常工作。

任何帮助将不胜感激!谢谢! 杰夫

【问题讨论】:

    标签: ruby-on-rails ruby regex validation


    【解决方案1】:

    我正在以这种方式验证:

    var ck_lat = /^-?([1-8]?\d(?:\.\d{1,})?|90(?:\.0{1,6})?)$/;
    var ck_lon = /^-?((?:1[0-7]|[1-9])?\d(?:\.\d{1,})?|180(?:\.0{1,})?)$/;
    var lat = 89.320615;
    var lon = 179.400520;
    
    if(ck_lat.test(lat) && ck_lon.test(lon)) {
        //Was a valid latitude and longitude pair :)
    }
    

    这是在开发阶段,但它工作正常,这是测试两个正则表达式的链接:

    查看纬度:http://rubular.com/r/vodC5TW3lG

    检查经度:http://rubular.com/r/3LIIcjFEQT

    编辑: 感谢蒂姆凯利的改进,这个捕获 -90 / -180,我认为现在已经完成了 :) 链接和代码已编辑。

    【讨论】:

    • FWIW,您的解决方案捕获最多,但没有分别捕获 -90 或 -180 ......但真的很接近! :) 只需移动“-?”在第一个括号之外像这样: "/^-?([1-8]?\d(?:\.\d{1,})?|90(?:\.0{1,6})?) $/" 表示纬度,并且: "/^-?((?:1[0-7]|[1-9])?\d(?:\.\d{1,})?|180( ?:\.0{1,})?)$/" 表示经度。干杯!
    【解决方案2】:

    纬度范围从 -90 到 90 经度范围从-180到180

    我使用了一个正则表达式来评估介于 4-6 个小数点范围之间的值(因为在 google maps api 中大多数使用 6 个小数点精度)

    纬度/^(-?(90\.0{4,6})|([0-8]\d{0,1})\.\d{4,6})$/

    http://rubular.com/r/UpY74Y4fuG

    经度: /^(-?((180)\.0{4,6})|((1[0-7][0-9])|([0-9]\d{0,1}))\.\d{4,6})$/

    http://rubular.com/r/OQ0KS7puhv

    【讨论】:

      【解决方案3】:

      /^-?\d+\.\d+\,\s?-?\d+\.\d+$/

      • ^ 匹配开头的
      • $ 匹配字符串的结尾
      • -? 匹配可选的减号
      • \d+ 匹配 1 个或多个数字
      • \. 算出一个点(你必须转义它,因为. 匹配任何字符)
      • \s? 匹配一个可选的空格

      您可能希望在开头或结尾接受空格:

      /^\s*-?\d+\.\d+\,\s?-?\d+\.\d+\s*$/

      【讨论】:

      • 经过测试和工作 rubular.com/r/efAZkpiNMl。一个建议@Leventix:/^\s*[-+]?\d+\.\d+\,\s?[-+]?\d+\.\d+\s*$/ 允许 + 和 -。顺便说一句,很酷的解决方案。 :)
      • 另一个建议:/^\s*[-+]?\d{1,3}\.\d+\,\s?[-+]?\d{1,3}\.\d+\s*$/ - 因为纬度和经度应该在 0 到 180 之间。
      • 干杯,伙计们!感谢您的解释 - 这将有助于我稍后再询问!
      • 无关且旧,但转义逗号是不必要的。
      【解决方案4】:

      可以使用正则表达式,但是您可能会发现使用 split 更容易,如下所示

      latitude, longitude = latlong.split(',')
      

      然后检查两个变量的数值。

      【讨论】:

      • 我更喜欢这个解决方案,因为它还有助于对值进行范围检查(应该在 -180 到 180 之间)。
      • @Chris -180 到 +180 适合经度,纬度是 -90 到 +90
      猜你喜欢
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2011-03-31
      相关资源
      最近更新 更多