Использование регулярных выражений для получения строки между кавычками из текстового файла в Java - PullRequest
2 голосов
/ 04 апреля 2019

Хорошо, я понимаю, что есть много вопросов о регулярных выражениях, но спасибо, что нашли время

Отредактировано, чтобы быть решенным кодом

https://stackoverflow.com/a/25791942/8926366 проведен ответ

У меня есть текстовый файл с кавычками, который я хочу поместить в ArrayList<String>. Для этого я использую методы Scanner и File, и я хотел ознакомиться с регулярным выражением, потому что это кажется действительно эффективным способом сделать это. За исключением того, что я не могу заставить его работать, конечно!

Мне удалось собрать воедино следующий символ регулярного выражения, предоставленный руководителями и решениями о людях, которые, как я понимаю, примерно на 85%:

(?<=(["']\b))(?:(?=(\\?))\2.)*?(?=\1) теперь я понимаю это так:

(?<=       # positive lookbehind group1
  (        # for this new group group2
   ["']    # the characters I am looking for
   \b      # word boundary anchor
  )        # end group2
)          # end group1
(?:        # non-capturing group3
  (?=      # lookahead group4
    (\\?)  # I still have no idea what this means exactly
  )        # end group 4
  \2       # matching the contents of the 2nd group in the expression.
)          # end group3
*?         # lazy 
(?=\1)     # look ahead for group 1

Я сейчас подтверждаю, что это не работает, ха-ха

Это, однако, работает (вроде как, удалено 'из [\ "] из-за моей французской клавиатуры, было бы слишком долго отделять запятые от французских кавычек, в этом случае это не так уж и важно)

* +1025 * ([\ "]) ((?:?.? (= (\\)) \ 3) *) \ 1 * * одна тысяча двадцать шесть

с вводом:

«Две вещи бесконечны: вселенная и человеческая глупость; и я не уверен во вселенной».

«Тот, кто думает о великих мыслях, часто делает большие ошибки» - Мартин Хайдеггер

это дает:

Две вещи бесконечны: вселенная и человеческая глупость; и я не уверен насчет вселенной.

Тот, кто думает о великих мыслях, часто делает большие ошибки

Для всех тех, кто смущен тем, почему их регулярное выражение не работает для txt-файла - попробуйте использовать notepad ++ или что-нибудь, чтобы заменить все возможные кавычки (обязательно проверьте закрывающие и открывающие символы!) Одним видом кавычек

Вот метод: (теперь прекрасно работает)


  public class WitticismFileParser {

   ArrayList<String> witticisms;
   Scanner scan;
   String regex="([\"])((?:(?=(\\\\?))\\3.)*?)\\1"; //"(?s)([\"])((?<quotedText>(?=(\\\\?))\\3.)*?)(?<[\"])";
   public ArrayList<String> parse(String FILE_PATH){

       witticisms = new ArrayList<>();
       Pattern pattern = Pattern.compile(regex);


       try{
           File txt= new File(FILE_PATH);
           scan= new Scanner(txt);
           String line="";
           Matcher matcher;
           matcher=pattern.matcher(line);

           while(scan.hasNext()){
               line=scan.nextLine();
               matcher=matcher.reset(line);

               if (matcher.find()){
                   line=matcher.group(2);
                   witticisms.add(line);
                   System.out.println(line);
               }

           }

       }catch(IOException e){
           System.err.println("IO Exception- "+ e.getMessage());
           e.printStackTrace();

       }catch(Exception e){
           System.err.println("Exception- "+e.getMessage());
           e.printStackTrace();
       }finally{
           if(scan!=null)
               scan.close();       
       }

       return witticisms;
   }

}

устранение неисправностей здесь

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

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

Спасибо всем, кто ответил !!

1 Ответ

0 голосов
/ 05 апреля 2019

Почему бы просто не использовать приведенное ниже регулярное выражение?

"(?<textBetweenQuotes>[\s\S]*?)"

" matches the character " literally.
(?<textBetweenQuotes> is the start of a named capture group.
[\s\S]*? matches any character including newlines between zero or an infinite amount of times but lazily (so stopping as soon as possible).
) is the end of the named capture group.
" matches the character " literally.

Если вы не можете использовать именованные группы захвата в своей программе, вы всегда можете использовать приведенное ниже регулярное выражение без него и заменить его кавычками.

"[\s\S]*?"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...