如何使用java模式在模式之间提取线条?

时间:2016-09-27 22:24:17

标签: java regex string

尝试使用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

逐行尝试阅读,但没有帮助。任何人都可以帮忙

1 个答案:

答案 0 :(得分:0)

您目前的尝试中存在一些问题。

  1. Matcher中的组从一个索引,而不是零。因此group(1)会在<地址1&#34; 之前为您提供值;标记

  2. 如果您需要在相同的字符串 1 上重复使用find,则使用find的错误重载。该重载开始在字符串的开头寻找匹配。您需要一个带偏移量的重载来开始搜索。逻辑将是这样的:

    start <- 0
    while ( matcher.find(start) ) {
        ...
        start <- matcher.end(0)
    }
    
  3. 1 - 我不相信你是,但我不完全确定我理解你的任务。输入是由一条记录还是多条记录组成?