0

北米の郵便番号を検証するために使用する次の正規表現があります。

(?:(\d{5})(?:-\d{4})?)|(?:([a-zA-Z]\d[a-zA-Z]) ?(\d[a-zA-Z]\d))

参考までに、特定の位置で特定の文字を確認することに関しては、より正確になる可能性があることを理解しています.

私がやりたいのは、この同じ検証定数を使用して、郵便番号も次の形式で抽出することです。

00000
  or
a0a0a0

上記の正規表現がそれに近づきます。すべてのキャプチャ グループ (ルートを除く) を連結すると、求める結果が得られます。たとえば、米国のコードはグループ 1 でキャプチャされ、カナダのコードは 2 + 3 でキャプチャされます。

これを行うより良い方法はありますか?または、すべてのサブグループを連結することが正規表現ライブラリの機能であると想定されているかもしれません。(ちなみにこれはC#.NETです)

4

1 に答える 1

0

2nd( ([a-zA-Z]\d[a-zA-Z])) と 3rd( (\d[a-zA-Z]\d)) グループをパッシブにしますが、カナダのコード グループ ((?:([a-zA-Z]\d[a-zA-Z]) ?(\d[a-zA-Z]\d))現在はパッシブ) を非パッシブにします。この場合、2 つの非パッシブ グループのみが存在します。1 つは米国コード用、もう 1 つはカナダ用です。また、各グループに単語境界を追加します。

var regex = new Regex(@"\b(?:(\d{5})(?:-\d{4})?)\b|\b((?:[A-Z]\d[A-Z]) ?(?:\d[A-Z]\d))\b", RegexOptions.IgnoreCase);
var input = @"00000 or a0a 0a0 and not 11111a or b1b1b11";
var postalCodes = regex.Matches(input)
    .Cast<Match>()
    .Select(m => m.Value)
    .ToArray();

00000これはandに一致しa0a 0a0ますが、正しくない11111aandをスキップしb1b1b11ます。

于 2012-11-14T08:55:52.797 に答える