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

Regex for validation of coordinates (latitude and longitude pairs) array in a string

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

latitude,longitude|latitude,longitude|... (n of these pairs) ...|latitude,longitude

现在,我有 latitude 的正则表达式,它是:

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

经度 的正则表达式是:

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

由于我不了解或从未使用过 REGEX 表达式,我恳求有这方面经验的人提供一个表达式来验证我的字符串。

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

如果您不太了解正则表达式,那么使用如此复杂的正则表达式是个坏主意。特别是如果你需要在 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})?)";

"wrapper" 表达式将是

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

对此有几点说明:

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

我对反斜杠进行了双重转义,因为在 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})?)))*$/