gpt4 book ai didi

javascript - 用于匹配经纬度对列表的正则表达式

转载 作者:行者123 更新时间:2023-11-30 19:22:44 25 4
gpt4 key购买 nike

我一直在寻找一种方法来验证纬度/经度对列表。尽管我找到了一些关于如何 validate pairs 的好例子以及如何validate a list of pairs ,我一直无法编写正则表达式来满足我的特定要求。要求如下:

  1. 每个纬度/经度对必须包含有效值(从 first link 求解)
  2. 每对必须用逗号与其他对分开。 The second link使用分号,但将其替换为逗号会导致正则表达式出现一些问题
  3. 必须有偶数个坐标,这样每个坐标都是成对的
  4. 逗号后可以有空格
  5. 至少需要3个坐标对,这样坐标才能形成一个多边形(但我们不用担心坐标重复),最后的坐标对后面不要跟逗号

以下条目应该是有效的:

32.3078, 64.7505,
27.6648, 81.5158,
18.2208, 66.5901

32.3078, 64.7505,
27.6648, 81.5158,
18.2208, 66.5901,
32.3078, 64.7505,
27.6648, 81.5158,
18.2208, 66.5901

32.3078,64.7505,27.6648,81.5158,18.2208,66.5901

虽然这些应该是无效的:

//only 1 pair
32.3078, 64.7505

//no commas separating each pair
32.3078, 64.7505
27.6648, 81.5158
18.2208, 66.5901

//odd number of pairs
32.3078, 64.7505,
27.6648, 81.5158,
18.2208, 66.5901,
32.3078, 64.7505,
27.6648, 81.5158,
18.2208

//comma after the final pair
32.3078, 64.7505,
27.6648, 81.5158,
18.2208, 66.5901,

最佳答案

改进的解决方案

编辑:感谢建议,我重新设计了我的解决方案,并决定在代码中而不是在正则表达式中担心尾随逗号和边界检查是最有意义的。我已经能够显着降低正则表达式的复杂性。

以下是我最终的解决方案:

^((-?(\d{1,3})(\.\d+)?,\s*){2}){3,}$

主组匹配单个坐标:

(-?(\d{1,3})(\.\d+)?,\s*)
-? Optional negative sign
(\d{1,3}) Match any sequence of 1 to 3 digits
(\.\d+)? Optionally match a decimal point followed by at least 1 digit
,\s* Match a comma followed by any amount or type of white-space

这将匹配 83.1642,, 1,, 987.654321,-91.000 这些都是有效的格式(我们想要的),尽管它们可能不在范围内(我们可以稍后在代码中检查)。

现在,对于正则表达式的其余部分:

(-?(\d{1,3})(\.\d+)?,\s*){2}
{2} Requires that exactly a pair of points be present

((-?(\d{1,3})(\.\d+)?,\s*){2}){3,}
{3,} Requires that 3 or more pairs of points must be present

当然,^$ 分别表示字符串的开始和结束。这为我们提供了正则表达式(几乎!)匹配我们问题中的所有字符串:^((-?(\d{1,3})(\.\d+)?,\s*){2 }){3,}$

您可能会注意到这需要一个尾随逗号,这与我们的问题不同。以下字符串被认为是有效的:

32.3078, 64.7505,
27.6648, 81.5158,
18.2208, 66.5901,
32.3078, 64.7505,
27.6648, 81.5158,
18.2208, 66.5901,
32.3078, 64.7505,
27.6648, 81.5158,
18.2208, 66.5901,
32.3078,64.7505,27.6648,81.5158,18.2208,66.5901,

要解决尾随逗号问题,我们可以简单地将逗号连接到代码中的字符串,如下所示:

(string + ',').match(/^((-?(\d{1,3})(\.\d+)?,\s*){2}){3,}$/)

瞧!我们的代码现在匹配没有尾随逗号的坐标对列表!


旧方案

当我弄清楚时,我正要发布我的问题,所以这是我的解决方案:

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

上半场

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

应该匹配第一行减去第一行末尾的逗号。下半场,

(,\s*[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)){2,}

匹配所有后续行,需要至少 2 个以上的坐标对,最少总数为 3 个。固有地需要偶数个坐标。

参见 regex101用于工作查询

关于javascript - 用于匹配经纬度对列表的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57280510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com