这个正则表达式有一个或两个组吗? “^ \\ S * \\ S +(。*?) - '(。*)\\ S + \\ S * $”

时间:2010-10-18 20:50:26

标签: java regex

这个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();

4 个答案:

答案 0 :(得分:4)

两个组 - '不是正则表达式中的特殊字符。你得到的错误是什么?

此外,他们从零开始。来自javadoc:

  

组零表示整个模式,   所以表达式m.group(0)是   相当于m.group()。

答案 1 :(得分:3)

有两个小组,但错误是因为匹配器没有做任何事情 尝试在matcher.group(1)获取第一个组时,会抛出IllegalStateException 必须调用其中一种方法matcheslookingAtfind 这应该做:

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!");
}

您也可能希望将群组更改为(。+),以确保您不会获得包含空作者/标题的图书。