簡體   English   中英

正則表達式以匹配許多坐標格式

[英]Regular Expression to match many coordinate formats

我正在研究一種正則表達式,它將匹配許多不同類型的位置坐標。 到目前為止,它與大約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°北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“北74°7'23”西

40°7'23“ -74°7'23”

40d 7'23“ N 74d 7'23” W

40.123N 74.123瓦

40°7.38,-74°7.38

測試是否有效: https//regexr.com/3ivu2

在此處輸入圖片說明

如您所見,空格和逗號存在問題,導致正則表達式與其中某些格式不匹配。

我正在嘗試匹配坐標字符串,以便它們可以在我的iOS應用中突出顯示,並允許用戶點擊它們。

我該怎么做來更新正則表達式並解決匹配問題?

概觀

我敢肯定有很多方法可以解決這個問題。 由於您尚未指定正則表達式引擎或編程語言,因此我將發布一種適用於PCRE的引擎以及在大多數引擎中應該使用的引擎。 與非PCRE regex相比,PCRE regex更容易理解,但是兩者都使用完全相同的邏輯。

下面定義的模式與問題中顯示的每個字符串匹配,並正確分隔坐標的每個部分(x,y)。


PCRE

此方法使用DEFINE構造來預定義模式。 這種構造的優點在於,您可以在一個位置定義正則表達式的可重用部分,因此,只需編輯這些子模式即可編輯大多數正則表達式。

查看正則表達式在這里使用

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

標志: gix

非PCRE

查看正則表達式在這里使用

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

標志: gix

某些引擎沒有x標志。 對於這些引擎,您可以使用以下單缸( 如此處所示 ):

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

說明

由於兩種模式本質上是相同的(非PCRE只是PCRE的擴展版本),我將定義PCRE regex模式,因為它更容易掌握。

請注意,使用x的模式已轉義了空格,因為否則它們將被忽略( x忽略模式中的空白)。 i標志使我們能夠匹配大小寫的文本( i使我們的模式不區分大小寫)。

限定

  • (?(DEFINE)...) DEFINE組被正則表達式完全忽略。 它被視為var name=value ,而您可以通過其名稱來調用要使用的特定模式。
  • (?<ns>[ns])ns匹配集合nsNS中的任何字符
  • (?<ew>[ew])ew匹配集合ewEW中的任何字符
  • (?<d>[°´''"d:])d匹配集合°´''"d:中的任何字符°´''"d:
  • (?<n>[+-]?\\d+(?:\\.\\d+)?)n匹配與以下結構匹配的任何數字
    • [+-]? (可選)匹配集合中的任何字符+-
    • \\d+匹配一個或多個數字
    • (?:\\.\\d+)? (可選)匹配小數點后跟一位或多位數字

圖案

圖案由3個較大的部分組成。 第一個和最后一個是捕獲組(坐標本身),第二個是將兩者分開的對象。

  • 捕獲1:
    • (?&ns)? (可選)匹配組ns
    • (?:\\ ?(?&n)(?&d)?){1,3}匹配1至3次[可選空格,后跟n組,然后可選地是d組]
    • \\ ?(?&ns)? 可選地匹配一個空格,可選地匹配組ns
  • \\ ?,?\\ ? 匹配可選的空格,逗號和空格(這將分隔每個坐標部分)
  • 捕獲2:與捕獲1相同,但用ew組替換ns

這個簡化的正則表達式實際上符合您提供的所有模式:

^((?:[NW]? ?(?:[-\d.d]+[NW:°´’'",]?[ NW]?)+[, ]*)+[NW]?)$

我不是坐標專家,但是如果我不考慮某些細節,可以輕松修改它。

完整的測試在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM