如何使用正则表达式提取地址

时间:2016-04-06 15:42:59

标签: java regex

我有一个文件,其中有一个地址,但一开始就有一个日期。我想要一个正则表达式来提取地址,因为我只是得到了日期。

地址格式

  • 1到5个数字
  • 空间然后
  • 连续的单词但没有数字
  • 空格或逗号
  • 字然后
  • 空格或逗号
  • 2个大写字母(以这两个字母结束)

即。

  • 5664 rue pierre labelle montreal QC
  • 5456 avenuemartincuré,sherbrooke,QC

我试过这个,但我一无所获。我玩的时间超过了几个小时,但有时我会得到文件的日期,这个日期在地址之前,然后是段落开头的2个单词。

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

这是文本的一部分

  

2016年7月23日

     

George Washington住在5664 rue pierre labelle montreal QC G1H   3A4。 Lorem ipsum dolor sit amet,consectetur adipiscing elit。

另一份文件

  

2016年1月5日

     

Juana Perez居住在5456 avenuemartincuré,sherbrooke,QC,   G1H 3A8。 Lorem ipsum dolor sit amet,consectetur adipiscing elit。

另一份文件

Salvador Dali living at

5 Ch Ste-Catherine 
Montreal QC 
J2S 8W3 

2 个答案:

答案 0 :(得分:0)

这个数据集的一个非常好的事情是三个地址类型每个都有不同的行数,特别是1,2或3.您可以使用它来确定地址具有哪种格式,然后轻松提取您的内容需要。你会注意到我在我的解决方案中甚至没有使用一个正则表达式。

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]);
    }
}

答案 1 :(得分:0)

这是java等价的regex101.com/r/vA8oC2/4

基本上开始搜索@ "at",直到找到"."

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");


 }
}