2015-05-21 1 views
-2

Я хочу применить свое регулярное выражение не только к первой строке текстового файла, но и ко всем строкам. В настоящее время он соответствует только тогда, когда все соответствующие соответствия находятся на одной линии. И если соответствующее совпадение продолжается на следующей строке - это совсем не совпадает.Как применить регулярное выражение ко всему файлу, а не только строку за строкой?

class Parser { 
    public static void main(String[] args) throws IOException { 

    Pattern patt = Pattern.compile("(include|" 
      + "integrate|" 
      + "driven based on|" 
      + "facilitate through|" 
      + "contain|" 
      + "using|" 
      + "equipped" 
      + "integrate|" 
      + "implement|" 
      + "utilized to facilitate|" 
      + "comprise){1}" 
      + "[\\s\\w\\,\\(\\)\\;\\:]*\\."); //Regex 
    BufferedReader r = new BufferedReader(new FileReader("E:/test/test.txt")); // read the file 


    String line; 
    PrintWriter pWriter = null; 
    while ((line = r.readLine()) != null) {   
     Matcher matcher = patt.matcher(line); 
    while (matcher.find()) { 

     try{ 
      pWriter = new PrintWriter(new BufferedWriter(new FileWriter("E:/test/test1.txt", true)));//append any given input 
      pWriter.println(matcher.group()); //write the result of matcher to the new file 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } finally { 
      if (pWriter != null){ 
       pWriter.flush(); 

       pWriter.close(); 
      } 
     } 

     System.out.println(matcher.group()); 

     } 
    } 
    } 
} 
+0

использовать глобальный модификатор – Razib

+0

Можете ли вы предоставить данные теста? У вас есть новые строки между выражениями, которые вы пытаетесь сопоставить? – maraca

+0

@Razib: В Java нет «глобального модификатора», он не нужен. Но даже на языках, которые его используют (например, JavaScript или Perl), это не относится к этой проблеме. –

ответ

1

Изменение while ((line = r.readLine()) != null) к этому:

String file = ""; // Basically, a conglomerate of all of the lines in the file 
while ((line = r.readLine()) != null) { 
    file += line; // Append each line to the "file" string 
} 
Matcher matcher = patt.matcher(file); 
while (matcher.find()) { 
    /* Blah blah blah, your outputting goes here. */ 
} 

Причина, по которой это происходит, состоит в том, что вы делаете каждую линию индивидуально. Для чего вам нужно применить регулярное выражение к файлу все сразу.

+0

Спасибо! ваш ответ помог мне –

+0

Без проблем, рад помочь! :) Если это решит ваш вопрос, я предлагаю вам отметить его как ответ, чтобы другие могли быстро это увидеть. – kkirigaya

+0

Это немного странно с тестовыми данными для этого регулярного выражения. Когда я использую свой собственный текст, который я набрал, регулярное выражение находит все, что мне нужно. Но когда я использую текст из преобразованного PDF-файла в txt-regex, он находит только первое совпадение. Я думаю, что он читает только ограниченное количество символов. –

0

В настоящее время сопряжение применяется к каждой строке, оно должно применяться ко всему файлу для работы по назначению.

Regex жадные, вы будете соответствовать все строки на первый матч, если у вас нет . (или другие специальные символы) в строке:

... 
     + "comprise){1}" 
     + "[\\s\\w\\,\\(\\)\\;\\:]*\\."); //Regex 

На последней строке соответствует любой пробел и слово, так что почти ничего, кроме .. Также {1} и большинство \ излишни (потому что в []):

... 
     + "comprise)" 
     + "[\\s\\w,();:]*\\."); //Regex 

Если вы не заботитесь о новой строки символов, просто удалите их первым, и он должен работать (я не вижу, как вокруг него, если вам есть что-то вроде "com\nprise" и хотите, чтобы соответствовать):

s = s.replaceAll("\\n+", ""); 
+0

и в какой позиции в коде следует вставить s = s.replaceAll ("\\ n +", ""); ? –

+0

после того, как вы прочитаете данные, вам необходимо прочитать весь файл, а затем заменить в результирующей строке, а затем применить совпадение. Поскольку вы избавились от всех новых строк, вы можете захотеть добавить \ n после каждого совпадения в выходном файле – maraca

+0

@OlegNekhayenko никогда не смейте комментарий о \ n, вы используете PrintWriter, это делается автоматически ... все остальное верно. – maraca