-3

street 、 city 、 state 、 zip を抽出する必要がある場所から文字列があります。

文字列は次のようになります

    a)$str1  ="2500 South 3850 West Suite A Salt Lake City, UT 84120-7225";
    b)$str2 ="19701 DaVinci  Lake Forest, CA 92610";
    c)$str3="abc ,def ,ca 1234"; -->(note there are two commas in this one)

現在、分割関数を使用して配列を取得し、それらの値を使用して作業を行っていますが、単一の正規表現でタスクを実行したいと考えています。ありがとう

4

2 に答える 2

2

Florianに同意します。正規表現が機能するようになるとすぐに、それが機能しない新しい文字列を導入すると、プログラムが機能しなくなります。

そうは言っても、あなたの例で機能する正規表現は次のとおりです。

#!/usr/bin/perl
use strict;
use warnings;

my $addr1 = "2500 South 3850 West Suite A Salt Lake City, UT 84120-7225";
my $addr2 = "19701 DaVinci  Lake Forest, CA 92610";
my $addr3 = "abc ,def ,ca 1234";

for my $addr($addr1,$addr2,$addr3){
  $addr =~ m/^(.*),[ \t]*([a-zA-Z]{2})[ \t]([0-9\-]*)$/;
  print "\naddr : '$1'\n";
  print "state: '$2'\n";
  print "zip  : '$3'\n";
}

ただし、住所のコンマに一貫性がないため、City を解析できません。

于 2012-11-13T15:40:14.743 に答える
2

一般に、場所は単純ではありません。テスト ケースに適した場所を見つけたとしても、正規表現が正しく一致しないケースに出くわす可能性が高いと確信しています。

どの文字列がどの部分に一致するかを完全に確信することはできないため、アドレスの解析は非常に困難です。

数字のある都市があります。特殊文字のある通り。通常のものに近いのは郵便番号だけです。かなり安全に抽出できますが、それは常に文字列の最後にある場合に限られます。

それ以外では、文字列をある種の住所データベースと照合して、抽出した都市/通りが存在するかどうかを確認する必要があります。

于 2012-11-13T12:08:03.690 に答える