这个regex
是否有一个或两个小组?
我正在尝试使用第二组访问bookTitle
,但收到错误:
Pattern pattern = Pattern.compile("^\\s*(.*?)\\s+-\\s+'(.*)'\\s*$");
Matcher matcher = pattern.matcher("William Faulkner - 'Light In August'");
String author = matcher.group(1).trim();
String bookTitle = matcher.group(2).trim();
答案 0 :(得分:4)
两个组 - '
不是正则表达式中的特殊字符。你得到的错误是什么?
此外,他们不从零开始。来自javadoc:
组零表示整个模式, 所以表达式m.group(0)是 相当于m.group()。
答案 1 :(得分:3)
有两个小组,但错误是因为匹配器没有做任何事情
尝试在matcher.group(1)
获取第一个组时,会抛出IllegalStateException
必须调用其中一种方法matches
,lookingAt
或find
这应该做:
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();
...
} else {
// not matched, what now?
}
答案 2 :(得分:2)
在询问小组之前添加以下其中一项。
matcher.find();
matcher.maches();
这是如何运作的:
匹配器是根据模式创建的 调用模式的匹配器方法。 一旦创建,就可以使用匹配器 进行三种不同的比赛 操作:
匹配方法尝试匹配 反对的整个输入序列 图案。
lookingAt 方法尝试匹配 输入序列,从...开始 开始,反对模式。
查找方法扫描输入 顺序寻找下一个 与模式匹配的子序列。
来源:Java Api
我个人建议你首先删除多个空格,然后拆分和修剪 - 中提琴简单,测试和工作。
试试这个:
String s = "William Faulkner - 'Light In August'";
String o[] = s.replaceAll("\\s+", " ").split("-");
String author = o[0].trim();
String bookTitle = o[1].trim();
如果你愿意:
System.out.println(author);
System.out.println(bookTitle);
然后输出:
William Faulkner
'Light In August'
答案 3 :(得分:1)
问题是Matcher类似乎很懒惰:它实际上推迟了评估,直到调用matches()方法。试试这个
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!");
}
您也可能希望将群组更改为(。+),以确保您不会获得包含空作者/标题的图书。