0

正規表現で、末尾が郵便番号で先頭が数字の住所を認識できるようにしたいと考えています。

したがって、サンプル文字列が

'abcd 123 abcd 1600 Penn Ave. Washington D.C. 12345 hello, world'

だけ合わせたい

1600 Penn Ave. Washington D.C. 12345

私は使用に行き詰まっています

.match(/\d+.*\d{5}/)

しかし、これは戻ります

123 abcd 1600 Penn Ave. Washington D.C. 12345

数値の最も近いインスタンスを返すにはどうすればよいですか?

4

3 に答える 3

0

これもオプションです。

.match(/\d+(\s(\D+|\d+\D{2})){3,6}\d{5}/)

これの意味は:

  1. 数字のグループを探します
  2. 3 ~ 6 個のグループ (1 つのスペース + いくつかの文字) が続いていることを確認してください。これらの文字は、数字以外、または数字と 2 文字の組み合わせのいずれかです。後者のタイプのグループ は、 The Tin Man が言及しているように、アドレスの1st3rd\d+\D{2}などのビットをアドレス指定します。しかし、それはAptと一致しません。2正しく。
  3. グループに 3 ~ 6 の数値範囲を指定すると、もちろんこれらの数値を調整でき、正規表現が少し異なるアドレスに一致するようになります。
  4. 試合の最後に郵便番号があることを確認してください

PS Rubularはあなたの友達です。

于 2013-01-21T22:34:19.553 に答える
0
.match(/\d+(\D)*?\d{5}/)

上記はあなたが望むものかもしれません。基本的に、間に余分な数字を入れたくない場合は、(\D)代わりに を使用できます(.)。追加?は、貪欲な一致ではなく、消極的な一致を行うように正規表現インタープリターに指示します。つまり、インタプリタは最短一致を返します。

欲張り派と気が進まない派にとって良い質問です。

于 2013-01-21T22:34:24.297 に答える
0

パターンの問題は、正規表現がデフォルトで貪欲であることです。.*つかみすぎており、より選択的になるように指示する必要があります。また、.任意のタイプの文字を取得しますが、これはおそらく必要なものではありません。

/(\d+\D+?\d{5})/どのキャプチャから始めますか:

1600 Penn Ave. Washington D.C. 12345

例えば:

'a 123 a 1600 Penn Ave. Washington D.C. 12345 foo'[/(\d+\D+?\d{5})/, 1]
=> "1600 Penn Ave. Washington D.C. 12345"

パターンは次のことを意味します。

  1. 最低1桁から始めてください...
  2. 少なくとも 1 つの非数字が続き、到達する最小量を選択します...
  3. 5 桁の数字。

1st. _

于 2013-01-21T22:39:27.623 に答える