Лучше использовать регулярное выражение или Stringtokenizer, чтобы найти автора и название книги в этом: Уильям Фолкнер - "Light In August"

Это лучше использовать regex или же Stringtokenizer разделить автора и заголовок в этой строке:

William Faulkner - 'Light In August'

Это самый простой regex это будет работать?

Pattern pattern = Pattern.compile("^\\s*([^-]+)-.*$");
Matcher matcher = pattern.matcher("William Faulkner - 'Light In August'");
String author = matcher.group(1).trim();
String bookTitle = matcher.group(2).trim();

Это перебор или есть более простой способ сделать это с Stringtokenizer?

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

3 ответа

Решение

Это зависит от того, как выглядит вход. Например, ваше регулярное выражение не будет работать с именами авторов, которые содержат дефис.

Возможно что-то вроде

Pattern.compile("^\\s*(.*?)\\s+-\\s+'(.*)'\\s*$")

может подойдет немного лучше.

Насколько вы контролируете вход? Можете ли вы гарантировать, что автор и заголовок всегда будут разделены " - " (пробел, тире и пробел)? Вы точно знаете, что автор не будет содержать " - "? И так далее.

Если ввод довольно жесткий, то вы можете просто использовать String#split(), который должен сделать это очень ясно, что вы делаете. Не используйте StringTokenizer ( источник):

StringTokenizer - это устаревший класс, который сохраняется по соображениям совместимости, хотя его использование не рекомендуется в новом коде. Всем, кто ищет эту функциональность, рекомендуется вместо этого использовать метод split String или пакет java.util.regex.

Ответ Марка Байерса показывает, как использовать split(),

Однако, если вам нужно беспокоиться о большем разнообразии входных данных (например, может ли количество пробелов вокруг тире быть переменным или не существовать вообще?), Тогда использование регулярного выражения будет кратким и кратким. Компромиссом является читаемость кода и ясность намерений.

Как насчет использования String.split?

String s = "William Faulkner - 'Light In August'";
String[] parts = s.split(" - ", 2);
String author = parts[0];
String title = parts[1];

ideone

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

Другие вопросы по тегам