9

我需要使用 RegEx 验证一个十六进制值,例如:24° 12' 55,4" 或 32° 24' 15,4"。

现在,我有下一个正则表达式,它与度数和分钟数匹配成功:

^([0-8][0-9]|[9][0])°\s([0-4][0-9]|[5][9])'$

但是,当添加秒验证器有问题:

^([0-8][0-9]|[9][0])°\s([0-4][0-9]|[5][9])'\s([0-4][0-9]|[5][9],[0-9])''$

我是 RegEx 的新手,有什么想法吗?

4

4 回答 4

12

首先,你有一些冗余:

^([0-8][0-9]|[9][0])°\s([0-4][0-9]|[5][9])'$

可以变得公正:

^([0-8][0-9]|90)°\s([0-4][0-9]|59)'$

接下来你有一个逻辑问题,在你的第二场比赛中,你匹配的是 0-4,然后是 0-9(即 00-49),然后只匹配 59。你可以将其更改为:

^([0-8][0-9]|90)°\s[0-5][0-9]'$

匹配 00-59

接下来让我们看看你的秒修改:

\s([0-4][0-9]|[5][9],[0-9])''$

与以前相同的问题,除了现在您添加了一个小数,但不是在 | 的两边 所以它只会在一侧匹配,如果我们像修复最后一个那样修复它:

^([0-8][0-9]|90)°\s[0-5][0-9]'\s[0-5][0-9],[0-9]''$

接下来你有两个单引号而不是双引号,所以修复它:

^([0-8][0-9]|90)°\s([0-5][0-9])'\s[0-5][0-9],[0-9]"$

现在我们需要问自己,第一个数字是强制性的吗?可能不是。因此,使用 a 将其标记为可能丢失?

^([0-8]?[0-9]|90)°\s[0-5]?[0-9]'\s[0-5]?[0-9],[0-9]"$

接下来,第二个的小数部分是强制性的吗?可能不会,所以将其标记为可能丢失:

^([0-8]?[0-9]|90)°\s[0-5]?[0-9]'\s[0-5]?[0-9](,[0-9])?"$

最后,我假设除了学位之外的每个部分都不是必需的,将它们标记为可能丢失:

^([0-8]?[0-9]|90)°(\s[0-5]?[0-9]')?(\s[0-5]?[0-9](,[0-9])?")?$

您还可以做其他事情来改善这一点。但是,这应该让你开始。

于 2013-08-19T19:47:02.293 回答
1

这是@OmnipotentEntity 正则表达式的改进。

特点

  • 负角匹配
  • 在 (+/-)360° 处停止匹配(所以它不匹配类似的东西360° 7' 24",但只匹配360°
  • 分别匹配度(最大360°)、分钟(最大59)和秒(最大 59.9")
  • 匹配度数和分钟的整数,但秒的浮点数(1 位精度)

请注意,它只接受小数点分隔符 ( .) 秒。根据您的需要更改此设置。

角度度、分和秒正则表达式

/^(?:(-?360(*ACCEPT))|(-?[1-3]?[0-9]?[0-9]?))°?\s?([0-5]?[0-9])?\'?\s?([0-5]?[0-9](?:.{1}[0-9])?)?"?$/

这是一个正则表达式操场的链接,可以尝试这个表达式的限制。

于 2021-12-08T21:47:54.083 回答
1

我最近有一个类似的用例,但必须匹配变体,例如

14° 58' 40.068" E
36°57'9" N

所以我想出了

(\d+)\s?\°\s?(\d+)\s?\'\s?(\d{1,}\.?\,?\d{0,}?)\"\s?(N|W|S|E)

在这里测试。

于 2020-05-28T16:58:39.420 回答
1

对于开源项目qalGeohash-TSQL,我需要一个比这个问题的答案和评论中提供的更强大的解决方案。

这个奇妙的在线正则表达式探索资源中玩了两个小时的解决方案后,我终于有了我需要的东西;经度(x 轴)和纬度(y 轴)中每一个的精确有限域。

经度解法:

  • 探索/实验的 URL(包括测试用例):https ://regexr.com/5lcpk
  • 正则表达式:^((180[°|\s]\s*)(0{1,2}['|\s]\s*)(0{1,2}([.|,]0{1,20})?["|\s]\s*)|((1[0-7]\d|\d\d|\d)[°|\s]\s*)(([0-5]\d|\d)['|\s]\s*)(([0-5]\d|\d)([.|,]\d{1,20})?["|\s]\s*))[EWew]$

纬度解决方案:

  • 探索/实验的 URL(包括测试用例):https ://regexr.com/5lcq9
  • 正则表达式:^((90[°|\s]\s*)(0{1,2}['|\s]\s*)(0{1,2}([.|,]0{1,20})?["|\s]\s*)|(([1-8]\d|\d)[°|\s]\s*)(([0-5]\d|\d)['|\s]\s*)(([0-5]\d|\d)([.|,]\d{1,20})?["|\s]\s*))[NSns]$

以下是构成上述解决方案的组件的细分:

经度分量:

  • 在 180 时:
    • 度数:(180[°|\s]\s*)
    • 分钟:(0{1,2}['|\s]\s*)
    • 秒:(0{1,2}([.|,]0{1,20})?["|\s]\s*)
  • 180以下:
    • 度数:((1[0-7]\d|\d\d|\d)[°|\s]\s*)
    • 分钟:(([0-5]\d|\d)['|\s]\s*)
    • 秒:(([0-5]\d|\d)([.|,]\d{1,20})?["|\s]\s*)
  • 定向:[EWew]

纬度组件:

  • 90 岁时:
    • 度数:(90[°|\s]\s*)
    • 分钟:(0{1,2}['|\s]\s*)
    • 秒:(0{1,2}([.|,]0{1,20})?["|\s]\s*)
  • 90以下:
    • 度数:(([1-8]\d|\d)[°|\s]\s*)
    • 分钟:(([0-5]\d|\d)['|\s]\s*)
    • 秒:(([0-5]\d|\d)([.|,]\d{1,20})?["|\s]\s*)
  • 定向:[NSns]
于 2021-01-30T23:12:44.220 回答