正则表达式,用于匹配纬度、经度,不带任何字符



我正在寻找一个正则表达式,它严格允许两个逗号分隔的浮点数字。

测试用例:

0,0
0.021312311323,0
0,0.012312312312
1.1,0.9836373

我试过的Regex是

^[-+]?([1-8]?d(.d+)?|90(.0+)?),s*[-+]?(180(.0+)?|((1[0-7]d)|([1-9]?d))(.d+)?)$D+|d*.?d+

这些是纬度和经度,但我只想在这些坐标中有两个值。

此正则表达式在以下情况下失败:

-10a, 10a
10a,10b

如果有任何帮助和指导,我将不胜感激。

正则表达式以两个冗余模式结束,应该在$之后删除D+|d*.?d+。由于$意味着字符串的末尾,它后面不能有更多的文本,而D+|d*.?d+需要一个或多个非数字字符,或者只将任何浮点或整数与d*.?d+匹配——这与您不受欢迎的字符串相匹配。

你可以使用

^([-+]?(?:[1-8]?d(?:.d+)?|90(?:.0+)?)),s*([-+]?(?:180(?:.0+)?|(?:1[0-7]d|[1-9]?d)(?:.d+)?))$

请参阅regex演示。注意,我将一些捕获组转换为非捕获组,因此只剩下两个"捕获"组;名义上的";捕获模式中的组。

详细信息

  • ^-字符串的开头
  • ([-+]?(?:[1-8]?d(?:.d+)?|90(?:.0+)?))-第1组:
    • [-+]?-可选-+
    • (?:[1-8]?d(?:.d+)?|90(?:.0+)?)-从0到89的数字([1-8]?d(,然后是可选的小数部分((?:.d+)?(,或者是90,然后是一个可选的.,后面跟着一个或多个0字符
  • ,s*-逗号和0+个空白字符
  • ([-+]?(?:180(?:.0+)?|(?:1[0-7]d|[1-9]?d)(?:.d+)?))-第2组:
    • [-+]?-可选-+
    • (?:180(?:.0+)?|(?:1[0-7]d|[1-9]?d)(?:.d+)?)-后面跟着可选.+一个或多个0字符的180数字,或者从0到179的数字,然后是可选小数部分
  • $—字符串结束

您的正则表达式几乎是正确的。您应该在$处停止,指示字符串的末尾。

const testCases = [ "0,0",
"0.021312311323,0",
"0,0.012312312312",
"1.1,0.9836373",
"-10a, 10a",
"10a,10b"];
const re = /^[-+]?([1-8]?d(.d+)?|90(.0+)?),s*[-+]?(180(.0+)?|((1[0-7]d)|([1-9]?d))(.d+)?)$/g;

testCases.forEach(tc => {
if(tc.match(re)) {
console.log("    VALID : " + tc );
} else {
console.log("NOT VALID : " + tc);
}
});

最新更新