0

在此字符串中使用regexStringtokenizer分隔作者和标题是否更好:

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并获得了帮助。

4

3 回答 3

2

你对输入有多少控制权?你能保证作者和标题总是用" - "(空格、破折号和空格)分隔吗?你确定作者不会包含" - "吗?等等。

如果输入非常严格,那么您可以简单地使用String#split(),这应该清楚您在做什么。不要使用 StringTokenizer ( source ):

StringTokenizer 是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人改用 String 的 split 方法或 java.util.regex 包。

Mark Byers 的回答向您展示了如何使用split().

但是,如果您不得不担心输入中的更多变化(例如,破折号周围的空白数量可以是可变的还是根本不存在?),那么使用正则表达式将是简洁明了的。然后权衡是代码的可读性和意图的清晰性。

于 2010-10-18T19:43:00.893 回答
1

这取决于输入的样子。例如,您的正则表达式将在包含连字符的作者姓名上失败。

也许像

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

可能更适合一点。

于 2010-10-18T19:41:14.600 回答
1

怎么用String.split

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

ideone

需要注意的一件事是,某些作者的姓名和书名包含连字符,因此仅在连字符上拆分通常并不总是有效。

于 2010-10-18T19:42:41.477 回答