Я пытаюсь найти регулярное выражение , чтобы отделить информацию об авторе и названии книги от набора данных.
Кажется, этот работает нормально:
^\s*(?:(.*)\s+-\s+)?'?([^']+'?.*)\s*$
На приведенных ниже данных идентифицирует автора в group 1
как текст, предшествующий первому дефису, и, в случае отсутствия дефиса, идентифицирует название книги в group 2
William Faulkner - 'Light In August'
William Faulkner - 'Sanctuary'
William Faulkner - 'The Sound and the Fury'
Saki - 'Esme'
Saki - 'The Unrest Cure' (Second Edition)
Saki (File Under: Hector Hugh Munro) - 'The Interlopers' (Anniversary Multi-pack)
William Faulkner - 'The Sound and the Fury' (Collector's Re-issue)
'The Sound and the Fury'
The Sound and the Fury
The Bible (St James Version)
Однако, в случае следующей строки, содержащей амперсанд, происходит сбой:
'Jim Clarke & Oscar Wilde'
Может ли кто-нибудь объяснить, почему это здесь не работает?
UPDATE:
Вот соответствующий код Java:
Pattern pattern = Pattern.compile("^\\s*(?:(.*)\\s+-\\s+)?'?([^']+'?.*)\\s*$");
Matcher matcher = pattern.matcher(text);
if(!matcher.matches())
{
logFailure(text);
}
else
{
String author = matcher.group(1).trim();
String bookTitle = matcher.group(2).trim();
}
A NullPointerException
добавляется в следующей строке из приведенной выше выдержки:
String author = matcher.group(1).trim();