我需要一个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。
答案 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})?)))*$/