2013-11-28 4 views
-5

Спасибо за вашу помощьКак написать регулярное выражение Java для этого текстового файла

Я надеюсь получить Id и категорию для каждого элемента в текстовом файле, как следующий:

Id: 0 
ASIN: 0771044445 
discontinued product 

Id: 1 
ASIN: 0827229534 
    title: Patterns of Preaching: A Sermon Sampler 
    group: Book 
    salesrank: 396585 
    similar: 5 0804215715 156101074X 0687023955 0687074231 082721619X 
    categories: 2 
    |Books[283155]|Subjects[1000]|Religion & Spirituality[22]|Christianity[12290]|Clergy[12360]|Preaching[12368] 
    |Books[283155]|Subjects[1000]|Religion & Spirituality[22]|Christianity[12290]|Clergy[12360]|Sermons[12370] 
    reviews: total: 2 downloaded: 2 avg rating: 5 
    2000-7-28 cutomer: A2JW67OY8U6HHK rating: 5 votes: 10 helpful: 9 
    2003-12-14 cutomer: A2VE83MZF98ITY rating: 5 votes: 6 helpful: 5 

Id: 2 
ASIN: 0738700797 
    title: Candlemas: Feast of Flames 
    group: Book 
    salesrank: 168596 
    similar: 5 0738700827 1567184960 1567182836 0738700525 0738700940 
    categories: 2 
    |Books[283155]|Subjects[1000]|Religion & Spirituality[22]|Earth-Based Religions[12472]|Wicca[12484] 
...... 

Результата должна быть организована как:

1 Book 

2 Book 

3 Book 

Затем я пишу программу Java для извлечения информации:

class Main 
{ 

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

    String file="/Users/swing/Desktop/test.rtf"; 

     BufferedReader br; 

     try 
     { 
      br = new BufferedReader(new FileReader(file)); 

      String line;  

      String re1=".*?"; // Non-greedy match on filler 
      String re2=""; // ID 1 

      String re3="((?:[c-z][a-z]+))"; // Category 1 

      Pattern p = Pattern.compile(re1+re2+re3,Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
      Matcher m = p.matcher(file); 

      while((line=br.readLine())!=null) 
      { 
      m=p.matcher(line); 

       if (m.find()) 
       { 
        String id1=m.group(1); 
        String category1=m.group(2); 
        System.out.print(" "+id1.toString()+" "+" "+category1.toString()+" "+"\n"); 
       }  
      } 
     } 
     catch (FileNotFoundException e)  
     {   
      e.printStackTrace(); 
      System.out.println("fail");} 
     } 
} 

Поскольку у меня нет опыта использования java регулярное выражение, поэтому результат неправильный, как следует, не могли бы вы помочь мне исправить неправильные коды? Благодаря !

Неправильный выход:

\r tf 

\font tbl 

color tbl 

ar gl 

ardir natural 

ardir natural 

AS IN 

dis continued 

AS IN 

tit le 

gro up 

ales rank 

simi lar 

.... 
+1

Последний день земли ... Бог простит вам мой сын –

+0

@ user3045306 Что это делает средняя категория для каждого элемента? Не могли бы вы предоставить правильный результат для регулярного выражения, которое вы хотите, в соответствии с вашим примером ввода? – Tafari

+0

@ Тафари извините за неудобства, категория означает группу продуктов, например, для идентификатора продукта 1, категория (группа) - это книга. – user3045306

ответ

0

Попробуйте с этим регулярным выражением и опций, которые уже имеем выбран (значение dotall и чувствительно к регистру):

PATTERN

Id:\s+?(\d).+?(?:group:|discontinued)\s(\w+?)\s 

ВХОД

файл .txt предоставили в вопросе

ВЫХОДА

Матчи:

1. Group 1: 0 
    Group 2: product 

2. Group 1: 1 
    Group 2: Book 

3. Group 1: 2 
    Group 2: Book 
+0

Спасибо, когда я сменил код на: String Id = "\ s +? (\ D). +? (?: group: | прекращено) \ s (\ w +?) \ S"; Шаблон p = Pattern.compile (Id, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); Матчи m = p.matcher (файл); он все еще не может работать .... я могу изменить правильно? или имеет некоторые синтаксические ошибки ..... – user3045306

+0

@ user3045306, вероятно, вам нужно избежать одинаковых символов, попробуйте следующее: String Id = "\\ s +? (\\ d). +? (?: group: | прекращено) \\ с (? \\ W +) \\ s "; Пожалуйста, примите мой ответ, если это вам помогло:) – Tafari

+0

Ошибка осложнений теперь, но выход пуст ....... – user3045306

Смежные вопросы