正,分,秒正则表达式

时间:2013-08-19 19:40:09

标签: regex

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

现在,我有下一个RegEx,它与学位和分钟成功匹配:

^([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的新手,有什么想法吗?

3 个答案:

答案 0 :(得分:9)

首先,你有一些冗余:

^([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]"$

现在我们需要问问自己,这是强制性的第一个数字吗?可能不是。因此,使用?

将其标记为可能丢失
^([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])?")?$

你可以采取其他措施来改善这种状况。但是,这应该让你开始。

答案 1 :(得分: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)

可测试的here

答案 2 :(得分:1)

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

this fantastic online Regex exploration resource 内玩了两个小时的解决方案后,我终于得到了我需要的东西;经度(x 轴)和纬度(y 轴)的精确限定域。

经度解:

  • 探索/实验的网址(包括测试用例):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]$

纬度解决方案:

  • 探索/实验的网址(包括测试用例):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]