Java Matcher:如何使用一个正则表达式匹配多行

时间:2013-12-23 02:35:17

标签: java regex matcher

我的方法接受一个文件,并尝试在标题###Title###和结束###---###之间提取文本。我需要它来提取多行并将每一行放入一个数组中。但由于readAllLines()将所有行转换为数组,我不知道如何比较和匹配它。

public static ArrayList<String> getData(File f, String title) throws IOException {
    ArrayList<String> input = (ArrayList<String>) Files.readAllLines(f.toPath(), StandardCharsets.US_ASCII);
    ArrayList<String> output = new ArrayList<String>();

    //String? readLines = somehow make it possible to match
    System.out.println("Checking entry.");

    Pattern p = Pattern.compile("###" + title + "###(.*)###---###", Pattern.DOTALL);
    Matcher m = p.matcher(readLines);
    if (m.matches()) {
        m.matches();
        String matched = m.group(1);
        System.out.println("Contents: " + matched);
        String[] array = matched.split("\n");
        ArrayList<String> array2 = new ArrayList<String>();
        for (String j:array) {
            array2.add(j);
        }
        output = array2;
    } else {
        System.out.println("No matches.");
    }
    return output;
}

这是我的文件,我100%确定编译器正在读取正确的文件。

###Test File###
Entry 1
Entry 2
Data 1
Data 2
Test 1
Test 2
###---###

输出显示“不匹配。”而不是条目。

2 个答案:

答案 0 :(得分:4)

你不需要正则表达式。它足以循环遍历数组并逐行比较项目,并在开始和结束标记之间进行比较。

ArrayList<String> input = (ArrayList<String>) Files.readAllLines(f.toPath(), StandardCharsets.US_ASCII);
ArrayList<String> output = new ArrayList<String>();

boolean matched = false;
for (String line : input) {
    if (line.equals("###---###") && matched) matched = false; //needed parentheses
    if (matched) output.add(line);
    if (line.equals("###Test File###") && !matched) matched = true;
}

答案 1 :(得分:1)

根据您的评论,如果它们与发布的方式相同,那么我认为此要求不需要regex。您可以逐行阅读并包含“###”

public static void main(String args[])
  {
  ArrayList<String> dataList = new ArrayList<String>();
  try{
  // Open the file that is the first 
  // command line parameter
  FileInputStream fstream = new FileInputStream("textfile.txt");
  // Get the object of DataInputStream
  DataInputStream in = new DataInputStream(fstream);
  BufferedReader br = new BufferedReader(new InputStreamReader(in));
  String strLine;
  //Read File Line By Line
  while ((strLine = br.readLine()) != null)   {
  // this line will skip the header and footer with '###'
  if(!strLine.contains("###");
   dataList.add(strLine);
  }
  //Close the input stream
  in.close();
    }catch (Exception e){//Catch exception if any
  System.err.println("Error: " + e.getMessage());
  }
  }
//Now dataList has all the data between ###Test File### and ###---###
}

您还可以根据您的要求更改包含方法参数以忽略行!