2016-04-06 19 views
1

住所が書かれているが、冒頭に日付が書かれている文書がある。私はちょうど日付を取得しているので、正規表現は、アドレスを抽出したい。次いで正規表現で住所を抽出する方法

次いで

  • 1〜5の数字
  • 次いで空間
  • 連続する単語が、無
  • 次いで桁スペースまたはカンマアドレスの形式次いで
  • ワード
  • 空間またはコンマの場合
  • 大文字2つ(これら2つのファイルtters)

すなわち

  • 5664 RUEピエール・ラブレモントリオールQC
  • 5456大通りマーティン硬化、シャーブルック、QC

は、私はこれを試してみましたが、私は何を取得します。私は数時間以上演奏しましたが、アドレスの前にある文書の日付と段落の冒頭の2単語を時々取得します。

"\\d{1,5}\\s(\\b\\w+\\b){1,2}\\w*\\s?,?\\w*\\s?,?\\w*\\s?,?[A-ZA-Z]" 

これは5664 RUEピエール・ラブレモントリオールQC G1H 3A4に住んテキスト

2016年7月23日

ジョージ・ワシントンの一部です。 Lorem ipsum dolle amet、consectetur adipiscing elit。

5456大通りマーティン硬化、シャーブルック、QC、 G1H 3A8に住む別の文書

2016年1月5日

フアナ・ペレス。 Lorem ipsum dolle amet、consectetur adipiscing elit。

別の文書

Salvador Dali living at 

5 Ch Ste-Catherine 
Montreal QC 
J2S 8W3 
+2

を見つけるまで"at" @検索を開始。これらのアドレスのソースはどこにあるのか聞いてみてください。同じフォーマットのものをすべてエクスポートする方法がありますか? –

+0

当社はこのデータを統一し、サプライヤーに変更を提案している。しかし、その間に、すべてのテキストは、異なるサプライヤーから提供された契約書に基づいています。私たちはサービスを介してローカルにファイルを生成し(dbで保存しますが)、テキストはそれらによって送信されます。私は私の例で私が提供した3つのパターンを特定しました。多くの契約がありますが、これらは3つの形式のアドレスです。 –

+1

私はあなたに以下の解決策を教えました。実際に正規表現を使う必要はないと思います。 –

答えて

0

ここでは、regex101.com/r/vA8oC2/4のJavaに相当します。

基本的には、各アドレスは独自のフォーマットを持っているように見えるので、これは少し厄介かもしれません"."

package com.foo; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class TestRegex { 

public static void main(String[] args) { 
    Pattern compile = Pattern.compile("at\\s(\\d{1,5}[\\s\\w,\\d]+)\\.",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE| Pattern.UNICODE_CHARACTER_CLASS); 
    String s ="23 July 2016\n" 
      + "George Washington living at 5664 rue pierre labelle montreal QC G1H 3A4. Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" 
      +"05 January 2016\n" 
      + "Juana Perez living at 5456 avenue martin curé, sherbrooke, QC, G1H 3A8. Lorem ipsum dolor sit amet, consectetur adipiscing elit."; 
    System.out.println(s); 
    System.out.println(System.getProperty("line.separator")); 
    System.out.println("Searching Addresses....."); 
    System.out.println(System.getProperty("line.separator")); 
    Matcher matcher = compile.matcher(s); 
    while(matcher.find()){ 
     System.out.println(matcher.group(1)); 
    } 
    System.out.println(System.getProperty("line.separator")); 
    System.out.println("Completed Searching Addresses"); 


} 
} 
+0

あなたのためのもう一つの質問。アドレスが署名にある別の例です。まだ新しい行と新しい行のアドレスの各セグメントがあります。私はあなたのパターンに合うようにしたいが、うまくいかない。私は第3の変種で質問を更新しました。ありがとう! –

+1

https://regex101.com/r/vA8oC2/5 – Sanj

+0

ありがとうございます! –

0

このデータセットについての一つは本当に良いところは、3つのアドレスの種類ごとに異なる行数、具体的には1、2、または3あなたがこれを使用することができますを持っているということです住所の形式を決定し、必要なものを簡単に抽出します。私のソリューションでは正規表現を1つ使用していないことに気づくでしょう。

public static void main(String[] args) { 
    int state = 0; 

    String line; 
    String[] array = new String[3]; 
    BufferedReader br = new BufferedReader(new FileReader("addresses.txt")); 

    while ((line = br.readLine()) != null) { 
     if (line.equals("")) { 
      processAddress(array, state); 
      state = 0; 
     } 
     else { 
      array[state] = line; 
      ++state; 
     } 
    } 
} 

// You are free to handle each extracted address component however you like. 
// For the purpose of illustration, I chose to print the components to 
// the console. 
public static void processAddress(String[] array, int state) { 
    switch(state) { 
     case 1: 
      // 1701 Verling Ave, Saanichton, BC, V8M 1X6 
      String[] parts = array[0].split(","); 
      System.out.println("Address is " + parts[0]); 
      System.out.println("State/city is " + parts[1] + ", " + parts[2]); 
      System.out.println("Zip code is " + parts[3]); 

     case 2: 
      // 2916 Prior St 
      // Victoria BC V8T3Y5 
      String[] parts = array[1].split(" "); 
      System.out.println("Address is " + array[0]); 
      System.out.println("State/city is " + parts[0] + ", " + parts[1]); 
      System.out.println("Zip code is " + parts[2]); 

     case 3: 
      // 834 Johnson St 
      // Victoria BC 
      // V8W 1N3 
      System.out.println("Address is " + array[0]); 
      System.out.println("State/city is " + array[1]); 
      System.out.println("Zip code is " + array[2]); 
    } 
} 
+0

あなたの答えをありがとう。しかし、私は1つの問題がある、私のファイルはアドレスだけではありません。テキストは、例のようにテキストのどこかがアドレスである実際のコントラクトです。それは私が正規表現を使用すると、パターンに一致する素早く、必要なデータを抽出することができます。 –

+1

その後、IMOに悪い質問をしました。 _exact_形式のアドレスを教えてください。あなたはこれをしませんでした。 –