用于验证字符串中坐标(纬度和经度对)数组的正则表达式
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})?)))*$/
我需要一个 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})?)))*$/