Java中的正则表达式与文本文件中的任何内容都不匹配

时间:2014-01-24 19:10:18

标签: java regex

我有一个包含多行的文本文件

  1. 类别:您遇到的问题类型
  2. 描述:问题概述
  3. 如何解决:修复问题的方法(有马车 有时返回)
  4. 相关链接:其他资源
  5. **我的清单中没有数字;这是我能想到让它更整洁的唯一方式...... *

    我一直试图让我的代码识别“如何修复:”和“相关链接”之间的所有信息,当它有多行时。我从研究中得知,我必须使用(?s)或Pattern.DOTALL,但它们似乎都不起作用。我对Regex很新,所以我期待的是一些基本的东西。这是我的代码:

    String fileName = System.getProperty("user.home") + "/Desktop/Test.txt";
                    try {
                        FileReader fr = new FileReader(fileName);
                        BufferedReader br = new BufferedReader(fr);
                        sc1 = new Scanner(br);
                        String findingRegex = "(Description:.*)";
                        String recommRegex = "(?<=How To Fix:)(.*)(?=Related Links)";//regex I'm trying to use
                        Pattern pFinding = Pattern.compile(findingRegex);
                        Pattern pRecomm = Pattern.compile(recommRegex, Pattern.DOTALL);
                        while (sc1.hasNextLine()) {
                            String clean = sc1.nextLine().trim();
                            String clean2 = clean.replaceAll("\\\\x\\p{XDigit}{2}", "");
                            Matcher mFinding = pFinding.matcher(clean2);
                            Matcher mRecomm = pRecomm.matcher(clean2);
                            while (mFinding.find()) {                        
                                System.out.println(mFinding);
                            }
                            while (mRecomm.find()){
                                System.out.println(mRecomm); //nothing prints?
                            }
                        }
                        br.close();
                        fr.close();
                        System.out.println("The following data was imported: ");
                        try {
                            tbl.displayAll();
                        } catch (NullPointerException npe) {
                            System.out.println("You have no data.");
                        }
                    } catch (FileNotFoundException fnfe) {
                        System.out.println("File named Test.txt was not located on your desktop. Program Terminated.");
                        System.exit(0);
                    } catch (IOException ioe) {
                        System.out.println("The import operation failed. Program Terminated");
                        System.exit(0);
                    } finally {
                        sc1.close();
                    }
    

    最后,我在这里测试了我的Regex,它按预期工作了吗?  enter image description here

    我的解决方案:

    String findingRegex = "(?<=Description:)(.*)(?=How To Fix)";
    String recommRegex = "(?<=How To Fix:)(.*)(?=Related Links)";
    Pattern pFinding = Pattern.compile(findingRegex, Pattern.DOTALL);
    Pattern pRecomm = Pattern.compile(recommRegex, Pattern.DOTALL);
    
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();
    
    while (line != null){
      sb.append(line);
      sb.append(System.lineSeparator());
      line = br.readLine();
      }  
    String newFile = sb.toString();
    Matcher mFinding = pFinding.matcher(newFile);
    Matcher mRecomm = pRecomm.matcher(newFile);
    while (mFinding.find()) {                        
      System.out.println(mFinding);                            
      }
    while (mRecomm.find()){
      System.out.println(mRecomm);
      }
    

1 个答案:

答案 0 :(得分:1)

下面:

String clean = sc1.nextLine().trim();

您正在逐行打破输入。但是你要尝试匹配多条线。没有多行可供匹配,因为您只保留了一行。

您可以先将整个文件读入内存,然后再与之匹配。或者你可以做类似

的事情
StringBuilder sb = new StringBuilder();
int state = 0;
while (sc1.hasNextLine()) {
  String line = sc1.nextLine();
  if (line.contains("How To Fix:")) {
    state = 1;
  }
  if (state == 1) {
    sb.append(line);
  }
  if (line.contains("Related Links:")) {
    state = 0;
  }
}

(如果每个文件需要匹配多次,则需要修改此项。)