2016-09-27 74 views
0

尝试使用java提取两个模式(标记)之间的界限,通过将值存储在变量中我可以做到这一点。如何使用java模式提取模式之间的线?

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

public class RunExampleTest{ 

    private Pattern addressPattern = Pattern.compile(ADDRESS_PATTERN); 
    private Matcher matcher; 

    //Alternative 
    /*private Pattern addressPattern = 
     Pattern.compile(ADDRESS_PATTERN, Pattern.DOTALL);*/ 

    private static final String ADDRESS_PATTERN = "(?s)Address 1:\\s(.*)Address 2:"; 

    public static void main(String[] args) { 

     String data = "Testing... \n" + 
      "Address 1: 88 app 2/8\n" + 
      "superman taman, puchong\n" + 
      "36100, Malaysia\n" + 
      "Address 2: abc" + 
      "testing end"; 

     RunExampleTest obj = new RunExampleTest(); 
     List<String> list = obj.getAddress(data); 

     System.out.println("Test Data : "); 
     System.out.println(data + "\n"); 

     System.out.println("Address Resut : " + list); 

    } 

    private List<String> getAddress(String data){ 

     List<String> result = new ArrayList<String>(); 

     matcher = addressPattern.matcher(data); 

     while (matcher.find()) { 
      result.add(matcher.group(1)); 
     } 

     return result; 
    } 

} 

但不是从变量读取我需要从文件的开始和结束模式之间获取数据。

例如输入文件:

Address 1: xyz 
89/23 
Pin -12 
Address 2: abc address 
Address 1: xyz 
89/23 
Pin -12 
Address 2: abc address 

用下面的,

FileReader fileReader = new FileReader(file); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     StringBuffer stringBuffer = new StringBuffer(); 
     String line; 
     while ((line = bufferedReader.readLine()) != null) { 

     matcher = addressPattern.matcher(line); 

      while(matcher.find()) 
      { 
       System.out.println(line); 
      } 
     } 

输出文件:

xyz 
89/23 
Pin -12 
xyz 
89/23 
Pin -12 

试图通过线读线,但没有帮助。任何人都可以帮助

回答

0

你目前的尝试有几个问题。

  1. Matcher中的组是从一个索引而不是零索引的。所以,如果你需要使用find反复在同一个字符串,您使用的find错误超载group(1)会给你的价值前的`地址1" 标记。

  2. ,这超负荷开始寻找对于比赛在字符串的开头你需要接受一个偏移量开始搜索过载的逻辑是这样的:。

    start <- 0 
    while (matcher.find(start)) { 
        ... 
        start <- matcher.end(0) 
    } 
    

1 - 我不相信你是,但我不完全确定我理解你的任务。输入是由一个记录还是多个记录组成?

+0

我正在尝试读取文件,即非结构化数据。需要根据起始标记(地址1 :)和结束标记(地址2 :)从多行文件中提取。 –

+0

我已经想通了。我无法弄清楚的是,(和我引用)*“输入是由一条记录还是多条记录组成”*。 –

+0

多条记录。 –