Я разрабатываю синтаксический анализатор вручную на Java, и я хотел бы использовать регулярные выражения для анализа различных типов токенов. Проблема в том, что я также хотел бы иметь возможность точно сообщать текущий номер строки, если ввод не соответствует синтаксису.
Короче говоря, я столкнулся с проблемой, когда пытался сопоставить символ новой строки с классом Scanner. Точнее говоря, когда я пытаюсь сопоставить символ новой строки с шаблоном, используя класс Scanner, происходит сбой. Почти всегда. Но когда я выполняю такое же сопоставление, используя Matcher и ту же исходную строку, он извлекает новую строку точно так, как вы ожидаете. Есть ли причина для этого, которую я не могу обнаружить, или это ошибка, как я подозреваю?
К вашему сведению: я не смог найти ошибку в базе данных Sun, которая описывает эту проблему, поэтому, если это ошибка, об этом не сообщалось.
Пример кода:
Pattern newLinePattern = Pattern.compile("(\\r\\n?|\\n)", Pattern.MULTILINE);
String sourceString = "\r\n\n\r\r\n\n";
Scanner scan = new Scanner(sourceString);
scan.useDelimiter("");
int count = 0;
while (scan.hasNext(newLinePattern)) {
scan.next(newLinePattern);
count++;
}
System.out.println("found "+count+" newlines"); // finds 7 newlines
Matcher match = newLinePattern.matcher(sourceString);
count = 0;
while (match.find()) {
count++;
}
System.out.println("found "+count+" newlines"); // finds 5 newlines