gpt4 book ai didi

regex - 匹配多种坐标格式的正则表达式

转载 作者:行者123 更新时间:2023-12-04 17:46:40 26 4
gpt4 key购买 nike

我正在研究一个可以匹配许多不同类型的位置坐标的正则表达式。到目前为止,它匹配大约 90% 的格式:

([SNsn][\\s]*)?((?:[\\+-]?[0-9]*[\\.,][0-9]+)|(?:[\\+-]?[0-9]+))(?:(?:[^ms'′""″,\\.\\dNEWnew]?)|(?:[^ms'′""″,\\.\\dNEWnew]+((?:[\\+-]?[0-9]*[\\.,][0-9]+)|(?:[\\+-]?[0-9]+))(?:(?:[^ds°""″,\\.\\dNEWnew]?)|(?:[^ds°""″,\\.\\dNEWnew]+((?:[\\+-]?[0-9]*[\\.,][0-9]+)|(?:[\\+-]?[0-9]+))[^dm°'′,\\.\\dNEWnew]*))))([SNsn]?)[^\\dSNsnEWew]+([EWew][\\s]*)?((?:[\\+-]?[0-9]*[\\.,][0-9]+)|(?:[\\+-]?[0-9]+))(?:(?:[^ms'′""″,\\.\\dNEWnew]?)|(?:[^ms'′""″,\\.\\dNEWnew]+((?:[\\+-]?[0-9]*[\\.,][0-9]+)|(?:[\\+-]?[0-9]+))(?:(?:[^ds°""″,\\.\\dNEWnew]?)|(?:[^ds°""″,\\.\\dNEWnew]+((?:[\\+-]?[0-9]*[\\.,][0-9]+)|(?:[\\+-]?[0-9]+))[^dm°'′,\\.\\dNEWnew]*))))([EWew]?)

测试格式:

N 45° 55.732 W 122° 29.882

N 047° 38.938', W 122° 20.887'

40.123, -74.123

40.123° N 74.123° W

40° 7´ 22.8" N 74° 7´ 22.8" W

40° 7.38’ , -74° 7.38’

N40°7’22.8, W74°7’22.8"

40°7’22.8"N, 74°7’22.8"W

40 7 22.8, -74 7 22.8

40.123 -74.123

40.123°,-74.123°

144442800, -266842800

40.123N74.123W

4007.38N7407.38W

40°7’22.8"N, 74°7’22.8"W

400722.8N740722.8W

N 40 7.38 W 74 7.38

40:7:23N,74:7:23W

40:7:22.8N 74:7:22.8W

40°7’23"N 74°7’23"W

40°7’23" -74°7’23"

40d 7’ 23" N 74d 7’ 23" W

40.123N 74.123W

40° 7.38, -74° 7.38

测试它是否有效:https://regexr.com/3ivu2

enter image description here

如您所见,空格和逗号存在问题,导致正则表达式与其中一些格式不匹配。

我正在尝试匹配坐标字符串,以便它们可以在我的 iOS 应用程序中突出显示并允许用户点击它们。

我该怎么做才能更新正则表达式并修复匹配问题?

最佳答案

概览

我相信有很多方法可以解决这个问题。由于您没有指定正则表达式引擎或编程语言,我将发布一个适用于 PCRE 的引擎或适用于大多数引擎的引擎。 PCRE 正则表达式比非 PCRE 正则表达式更容易理解,但两者使用完全相同的逻辑。

下面定义的模式与您在问题中提供的每个字符串相匹配,并正确分隔坐标 (x, y) 的每个部分。


代码

PCRE

此方法使用 DEFINE构造以预定义模式。这种构造的美妙之处在于,您可以在一个位置定义正则表达式的可重用部分,因此,您只需编辑这些子模式即可编辑大部分正则表达式。

See regex in use here

(?(DEFINE)
(?<ns>[ns])
(?<ew>[ew])
(?<d>[°´’'"d:])
(?<n>[+-]?\d+(?:\.\d+)?)
)
(
(?&ns)?
(?:\ ?(?&n)(?&d)?){1,3}
\ ?(?&ns)?
)
\ ?,?\ ?
(
(?&ew)?
(?:\ ?(?&n)(?&d)?){1,3}
\ ?(?&ew)?
)

标志:gix

非PCRE

See regex in use here

(
[ns]?
(?:\ ?[+-]?\d+(?:\.\d+)?[°´’'"d:]?){1,3}
\ ?[ns]?
)
\ ?,?\ ?
(
[ew]?
(?:\ ?[+-]?\d+(?:\.\d+)?[°´’'"d:]?){1,3}
\ ?[ew]?
)

标志:gix .

有些引擎没有 x旗帜。对于这些引擎,您可以使用以下一行 (as seen here):

([ns]?(?: ?[+-]?\d+(?:\.\d+)?[°´’'"d:]?){1,3} ?[ns]?) ?,? ?([ew]?(?: ?[+-]?\d+(?:\.\d+)?[°´’'"d:]?){1,3} ?[ew]?)

解释

由于这两种模式本质上是相同的(非 PCRE 只是 PCRE 的扩展版本),我将定义 PCRE 正则表达式模式,因为它更容易掌握。

请注意,使用 x 的模式已经转义空格,否则它们将被忽略( x 忽略模式中的空格)。 i标志允许我们匹配文本而不考虑大小写(i 使我们的模式不区分大小写)。

定义

  • (?(DEFINE)...) DEFINE组被正则表达式完全忽略。它被视为 var name=value ,而您可以通过其名称记忆起要使用的特定模式。
  • (?<ns>[ns])本群ns匹配集合 nsNS 中的任何字符
  • (?<ew>[ew])本群ew匹配集合 ewEW 中的任何字符
  • (?<d>[°´’'"d:])本群d匹配集合 °´’'"d: 中的任何字符
  • (?<n>[+-]?\d+(?:\.\d+)?)本群n匹配任何符合以下结构的数字
    • [+-]?可选择匹配集合 +- 中的任何字符
    • \d+匹配一位或多位数字
    • (?:\.\d+)?可选择匹配小数点后跟一位或多位数字

图案

图案由 3 个较大的部分组成。第一个和最后一个是捕获组(坐标本身),第二个是将两者分开的。

  • 捕获 1:
    • (?&ns)?可选择匹配组 ns
    • (?:\ ?(?&n)(?&d)?){1,3}匹配 [一个可选空格,后跟组 n然后可选择分组 d ] 一到三遍
    • \ ?(?&ns)?可选匹配空格,可选匹配组 ns
  • \ ?,?\ ?匹配一个可选的空格、逗号和空格(这分隔每个坐标部分)
  • 捕获 2:这与捕获 1 相同,但替换了组 ns跟团ew

关于regex - 匹配多种坐标格式的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48177438/

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