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 番目の座標とスタイルが一致することを強制することです。これは、正規表現に求めるには多すぎます。
疑う人: これが実際の動作です。お楽しみください。