用于验证字符串中坐标(纬度和经度对)数组的正则表达式

时间:2015-11-04 09:30:49

标签: regex string coordinates latitude-longitude

我需要一个REGEX表达式来验证一个如下所示的字符串:

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

现在,我有纬度的REGEX,即:

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

经度的正则​​表达式:

{{1}}

由于我不理解或从未做过REGEX表达式,我恳请有经验的人提供一个表达式来验证我的字符串。

我在PHP中使用它,Laravel 4.2具体。但是,我猜这个解决方案也适用于Javascript。

1 个答案:

答案 0 :(得分:1)

如果你不熟悉正则表达式,那么使用这种复杂性的正则表达式是一个坏主意。特别是如果你需要在JS和PHP中使用它。

我建议使用这种技术:

  • 为经度和纬度声明变量(块)
  • 使用这些块编译带有必需语法的正则表达式。

所以,(在JS中)你阻止

var latitude = "(-?[1-8]?\\d(?:\\.\\d{1,18})?|90(?:\\.0{1,18})?)";
var longitude = "(-?(?:1[0-7]|[1-9])?\\d(?:\\.\\d{1,18})?|180(?:\\.0{1,18})?)";

“包装”表达式将是

var regex_str = "^(?:" + latitude + "," + longitude + "(?:\\|(?:" + latitude + "," + longitude + "))*$";

关于此的几点说明:

  • ^ - 字符串锚的开始(如果它是输入字符串中的第一个符号,则仅匹配下一个子模式)
  • (?:...) - 非捕获组,仅进行分组,不捕获(即不在任何缓冲区中存储任何匹配的子串)
  • \\| - 匹配文字|符号(必须转义)
  • * - 一个量词,表示 0或更多出现在前的子模式(类,组等)

我在JS中双重转义反斜杠,你需要一个构造函数来动态初始化正则表达式构建(var rx = RegExp(regex_str))。在PHP中,您可以使用$rx = "/$regex_str/"

whole regex看起来像

/^(?:(-?[1-8]?\d(?:\.\d{1,18})?|90(?:\.0{1,18})?),(-?(?:1[0-7]|[1-9])?\d(?:\.\d{1,18})?|180(?:\.0{1,18})?))(?:\|(?:(-?[1-8]?\d(?:\.\d{1,18})?|90(?:\.0{1,18})?),(-?(?:1[0-7]|[1-9])?\d(?:\.\d{1,18})?|180(?:\.0{1,18})?)))*$/