Как я могу изменить свое регулярное выражение для обработки выбросов данных? - PullRequest
0 голосов
/ 19 октября 2010

В идеале все мои данные должны выглядеть так:

William Faulkner - 'Light In August'
William Faulkner - 'Sanctuary'
William Faulkner - 'The Sound and the Fury'

В этом случае это регулярное выражение будет работать нормально:

Pattern pattern = Pattern.compile("^\\s*(.*)\\s+-\\s+'(.*)'\\s*$");
Matcher matcher = pattern.matcher("William Faulkner - 'Light In August'");

if (matcher.matches()) {
    String author = matcher.group(1).trim();
    String bookTitle = matcher.group(2).trim();

    System.out.println(author + " / " + bookTitle);
}
else {
   System.out.println("No match!");
}

Но иногда мои данные содержат примеры, подобные этим, которые, кажется, не соответствуют приведенной выше схеме:

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)

Во всех случаях, когда дефис не существует, это названия книг без авторов. Я не обнаружил ни одного случая, когда имя автора появлялось без названия книги.

Как я могу изменить свое регулярное выражение, чтобы справиться с этим правильно?

Ответы [ 2 ]

2 голосов
/ 19 октября 2010

Это регулярное выражение соответствует всем описанным вами случаям:

  ^\s*(?:(.*)\s+-\s+)?'?([^']+'?.*)\s*$

Как строка Java, это: "^\\s*(?:(.*)\\s+-\\s+)?'?([^']+'?.*)\\s*$"

Если вы используете JDK7, вы можете использовать именованную группу захвата следующим образом:

  ^\s*(?:(?<Author>.*)\s+-\s+)?'?(?<Title>[^']+'?.*)\s*$

, где <$<Author> и <$<Title> относятся к захваченной группе, в запасной части.

2 голосов
/ 19 октября 2010

Я бы не стал использовать для этого ни одного регулярного выражения.Вместо этого я бы использовал последовательность (или дерево) регулярных выражений для проверки различных альтернативных синтаксисов в некотором порядке, который дает наилучшие результаты.И я бы дал понять, что могут быть некоторые входные наборы, где результаты не будут идеальными ... независимо от того, какую эвристику вы используете.

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