[英]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)。
此方法使用DEFINE
構造來預定義模式。 這種構造的優點在於,您可以在一個位置定義正則表達式的可重用部分,因此,只需編輯這些子模式即可編輯大多數正則表達式。
(?(DEFINE)
(?<ns>[ns])
(?<ew>[ew])
(?<d>[°´’'"d:])
(?<n>[+-]?\d+(?:\.\d+)?)
)
(
(?&ns)?
(?:\ ?(?&n)(?&d)?){1,3}
\ ?(?&ns)?
)
\ ?,?\ ?
(
(?&ew)?
(?:\ ?(?&n)(?&d)?){1,3}
\ ?(?&ew)?
)
標志: gix
(
[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個較大的部分組成。 第一個和最后一個是捕獲組(坐標本身),第二個是將兩者分開的對象。
(?&ns)?
(可選)匹配組ns
(?:\\ ?(?&n)(?&d)?){1,3}
匹配1至3次[可選空格,后跟n
組,然后可選地是d
組] \\ ?(?&ns)?
可選地匹配一個空格,可選地匹配組ns
\\ ?,?\\ ?
匹配可選的空格,逗號和空格(這將分隔每個坐標部分) ew
組替換ns
組 這個簡化的正則表達式實際上符合您提供的所有模式:
^((?:[NW]? ?(?:[-\d.d]+[NW:°´’'",]?[ NW]?)+[, ]*)+[NW]?)$
我不是坐標專家,但是如果我不考慮某些細節,可以輕松修改它。
完整的測試在這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.