Лучше использовать регулярное выражение или 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];
Следует обратить внимание на то, что имена некоторых авторов и названия книг содержат дефисы, поэтому разбиение только на дефис не всегда будет работать.