Хорошо, я понимаю, что есть много вопросов о регулярных выражениях, но спасибо, что нашли время
Отредактировано, чтобы быть решенным кодом
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, чтобы все кавычки тоже были одинаковыми
В любом случае, спасибо за любую помощь с этим, у меня ужасная головная боль от чтения документации по регулярным выражениям
Спасибо всем, кто ответил !!