【问题标题】:Degrees, Minutes and seconds regex度、分和秒正则表达式
【发布时间】:2013-08-19 19:40:08
【问题描述】:

我需要使用 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 的新手,有什么想法吗?

【问题讨论】:

  • 你能用被错误接受或拒绝的具体值指定“问题”吗?当然,您可以简单地将它们从测试中复制出来? ;)
  • ^([0-8][0-9]|[9][0])°\s([0-4][0-9]|[5][9])'\s((?:[0-4][0-9]|[5][9]),[0-9])''$ 也许吧。但我不知道你的引擎。您使用哪种语言?
  • 您确定"'' 相同吗?
  • 用正则表达式进行这种值验证只会给你一个更复杂的正则表达式和更令人困惑的错误消息。我强烈建议您只使用 \d+ 作为数字部分,并处理它们超出代码范围。例如,您真的不希望分钟和秒的值在 50 到 58 之间(您允许 00-49 然后是 59),还是只是盲目地从验证 00-89 或 90 的度数的方式中复制?

标签: regex


【解决方案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])?)?"?$/

这是一个指向regex playground 的链接,以尝试此表达式的限制。

【讨论】:

    【解决方案2】:

    首先,你有一些冗余:

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

    您还可以采取其他措施来改善这一点。但是,这应该可以帮助您入门。

    【讨论】:

    • 我改进了@OmnipotentEntity 制作的正则表达式:/^([0-9]?[0-9]?|[1-2]?[0-9]?[0-9]?|[0-3]?[0-6]?[0-9]|360)?°?\s?([0-5]?[0-9])?'?\s?([0-5]?[0-9](,[0-9])?)?"?$/mg 这是一个示例测试:359° 59' 0" // 匹配 | 125° 59' 59" // 匹配 | 0° 0' 0" // 匹配 | 90° 0' 0" // 匹配 | 2° 1' 3" // 匹配 | 390° // 不匹配 | 1000° 1' 2" // 不匹配 | 360° 0' 0" // 匹配 | 361° 61' 61" // 不匹配 | 180° 0' // 匹配 | 180° // 匹配。您可以在 regex101.com/r/IAxQ7X/1 找到正则表达式
    • 很好地扩展了正则表达式!不幸的是,您的实现和我的实现似乎都错误地匹配了 360° 和 361° 之间的角度。例如,360° 1' 0" 是匹配的。(在我的实现中为 90° 和 91°。)您可以通过单独执行 90°(或 360°)来解决此问题:^(([0-8]?[0-9])°(\s[0-5]?[0-9]')?(\s[0-5]?[0-9](,[0-9])?")?|90°(\s0')?(\s(0(,0*)?")?
    【解决方案3】:

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

    this fantastic online Regex exploration resource 中玩了两个小时的解决方案后,我终于有了我需要的东西;经度(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]

    【讨论】:

    • 这可能是唯一考虑除 en-US 之外的文化代码的解决方案。
    【解决方案4】:

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

    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

    【讨论】:

    • 谢谢。尽管它是专门为匹配相关的后续组而设计的,例如prnt.sc/spmol6,而且还有实际的地理验证器。知道有什么方法可以让组保持原样但强制执行 DMS 标准吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多