2017-01-24 11 views
-4

私は一連の文字列を持つファイルを持っています。どの行に外国の住所が含まれているかを知る必要があります。外国人の住所は、以下に記載されているものと同じ2文字の郵便番号を使用しません。通常、データはタブで区切られた列にあり、ここにリストされている各例の3つのタブになります。私は、検索の結果を返す必要がPerl正規表現 - 特定の文字/スペースと5桁以上の数字を見つける

12354ジョン・ジョーンズ123 NパークアベニューカンザスシティMO 64012から9999

12354ジェーン・ジョーンズ123 SパークアベニューカンザスシティKS 65012

my @token = split $line, \t; 
foreach my $token(@token){ 
> $stateCode = $token =~ /\b(AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MH|MA|MI|FM|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VA|VI|WA|WV|WI|WY)\s{1,} \d{5,}\b/;} 

、リストされた文字の2桁の州コードと同様に。私がここに列挙した正規表現の検索は、正確な2桁の文字コードの1つで、その後に任意の数の空白が続き、その後に5桁の数字が続きます。
私の現在のコードは、2桁の状態コードを正しく見つけたり返さなかったりするので、正規表現検索の一部であったものを返す構文をどこに置くかわからないようです。

+3

タブで分解して分析しますか? – Jan

+1

これは[mcve]ではありません。あなたの質問を作成して[編集]してください。 –

答えて

1

一致する部分文字列を取得するには、リストコンテキストが必要です。あなたは括弧の中にmyに引数を囲むことにより、リストコンテキストを強制することができます。

if (my ($stateCode) = $token =~ /\b(AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MH|MA|MI|FM|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VA|VI|WA|WV|WI|WY)\s{1,} \d{5,}\b/) { 
    print $stateCode, "\n"; 
+0

正規表現を短くする必要はありません。 5.10+では交互にトライを使用しているため、グループ化によるパフォーマンス上の利点は得られません。 – ikegami

+0

また、元の正規表現は読みやすくなりました。米国がカナダを附属する場合、原産国は余分な国を追加しやすくなります! :D(政治については冗談だが、メンテナンス性に関してではない) – Tanktalus

+0

OK、OK、短い部分を削除。 – choroba

-1
($stateCode) = $token =~ /\b(AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MH|MA|MI|FM|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VA|VI|WA|WV|WI|WY)\s{1,}\d{5,}\b/; 

これは実際に動作しません。ポップアップするコンパイラのコマンドラインは、あまりにも多くのメモリを必要とするだけです。だから私の結果は私を捨てて、私の入力ファイルをカットした後、すべて正しく表示されます。

関連する問題