6

緯度/経度のペアをさまざまな方法で一致させたい正規表現があります。

123 34 42
-123* 34' 42"
123* 34' 42"
+123* 34' 42"
45* 12' 22"N
45 12' 22"S
90:00:00.0N

これらをペアで合わせられるようにしたい

90:00:00.0N 180:00:00.0E緯度/経度のペアです。

また

45* 12' 22"N 46* 12' 22"E緯度/経度のペア (1 度× 1 度のセル) です。

また

123* 34' 42" 124* 34' 42"緯度/経度のペアです

以下の正規表現を使用して、123 と入力すると一致します。123 00 00 は有効な座標なので、これは正しいと思います。ただし、この正規表現を使用して、上記と同じ形式のペアを一致させたい

   "([-|\\+]?\\d{1,3}[d|D|\u00B0|\\s](\\s*\\d{1,2}['|\u2019|\\s])?"
 + "(\\s*\\d{1,2}[\"|\u201d|\\s])?\\s*([N|n|S|s|E|e|W|w])?\\s?)"

私はJavaを使用しています。

は度数を表します。

正規表現で何が間違っていますか?

4

3 に答える 3

11

1 つには、不要なパイプ文字の束で文字セットを埋めているということです。代替は[]ペアで暗示されます。追加のクリーンアップ:+文字クラスでエスケープする必要はありません。あなたの正規表現は、あなたが私たちに与えたよりも大きな問題ステートメントに対処しているようです-あなたは、dまたはD一致する文字について言及していません。そして、RegEx の後半部分のほぼ全体をオプションにしました。あなたの元の問題文と思われるものから外れて、次の正規表現を作成しました。

^\s*([+-]?\d{1,3}\*?\s+\d{1,2}'?\s+\d{1,2}"?[NSEW]?|\d{1,3}(:\d{2}){2}\.\d[NSEW]\s*){1,2}$

少し大げさですが、あなた、または将来これに遭遇する人のために詳しく説明します (Hello, future!)。

^

シンプルな文字列の開始。

\s*

任意の量の空白 - 空白もありません。

( 

グループの始まりを示します - それについては後で説明します。

[-+]?

オプションの記号

\d{1,3}

1桁から3桁

\*?

オプションのアスタリスク - ここでのエスケープはアスタリスクのキーですが、これを実際の学位の Unicode コードポイントに置き換えたい場合は必要ありません。

\s+

少なくとも 1 文字の空白

\d{1,2}

1 桁または 2 桁。

'?

オプションのアポストロフィ

\s+\d{1,2}+

{1,2}これらは前に見たことがありますが、新しい変化球があります -数量詞の後にプラスがあります! これにより、これは所有量指定子になります。つまり、マッチャーは、このグループの一致を放棄して、別のグループを可能にすることはありません。これはほぼ完全に1 1 11 1 1一致を防ぐためにここにありますが、バックトラックできる必要がないことが 100% 確実な場合はどこでも速度を上げるために使用できます。

"?

オプションの二重引用符。Java でこれをエスケープする必要があります。

[NSEW]?

文字で指定されたオプションの基数方向

|

OR - これより前のグループのすべて、またはこの後のグループのすべてに一致させることができます。

\d{1,3}

古いニュース。

(:\d{2})

コロンの後に 2 文字...

{2}

二回!

\.\d

小数点の後に 1 桁の数字が続きます。

[NSEW]

前回と同じですが、今回は必須です。

\s*)

ある程度のスペースがあり、最後にグループの終わり。これで、最初のグループは経度/緯度の表示全体に一致し、最後に任意の量のスペースができました。密接に続いて:

{1,2}

それを 1 回か 2 回行います - 1 つまたはペアに一致させてから、最後に:

$

文字列の終わり。

これは完璧ではありませんが、かなり近いものであり、元の問題ステートメントに答えていると思います。さらに、私の説明は、必要に応じて編集できるほど十分にわかりやすくなっていると思います. それがしない (そしてしない) ことの 1 つは、最初の座標が 2 番目の座標とスタイルが一致することを強制することです。これは、正規表現に求めるには多すぎます。

疑う人: これが実際の動作です。お楽しみください。

于 2012-11-28T23:03:45.580 に答える
1

一般的に、これは良いアプローチだとは思いません。インターフェイスで、DMS 座標を 1 つの特定の形式にするようにしてください。
ユーザーはこれを 3 つの別々のテキスト フィールドに入力する必要があります。

さらに、この正規表現はあまり維持できません。

DMS 座標を表記する方法は他にもたくさんありますが、想像もできません。人間は創造的です。

例えば:

N,S を前に置く
または: North, 157 deg 50 min 55.796 sec
または: wiki から: NGS は現在、1993 年にその地点は 21-18-02.54891 N 157-50-45.90280 W であると述べています。

于 2012-11-28T18:23:17.123 に答える
0

私はREウィザードではありませんが、あなたのフォーマットでは、単一のテキストボックスから解析を行っている場合、どのペアが最初に来るか(おそらく緯度)について何らかの規則が必要です。

そこから、6 つの数値フィールド (それぞれに度、分、秒、場合によっては小数点を含む)、2 つの符号 (それぞれに + または -)、および最大 2 つの半球 (それぞれに 1 つ) があります。

私が見る限り、緯度が最初で経度が 2 番目であることのみを要求した場合、入力からのこれらの 8 ~ 10 フィールドの解析は毎回同じ順序で行われます。残りの記号 (小数点を除く) は、本質的に区切り記号として扱うことができます。

それはそれをより簡単にしますか?

于 2012-11-28T18:35:54.990 に答える