Java 如何更改正则表达式以处理数据异常值?

Java 如何更改正则表达式以处理数据异常值?,java,regex,Java,Regex,理想情况下,我的所有数据如下所示: William Faulkner - 'Light In August' William Faulkner - 'Sanctuary' William Faulkner - 'The Sound and the Fury' ^\s*(?:(?<Author>.*)\s+-\s+)?'?(?<Title>[^']+'?.*)\s*$ 在这种情况下,这个正则表达式似乎可以正常工作: Pattern pattern = Pattern

理想情况下,我的所有数据如下所示:

William Faulkner - 'Light In August'
William Faulkner - 'Sanctuary'
William Faulkner - 'The Sound and the Fury'
  ^\s*(?:(?<Author>.*)\s+-\s+)?'?(?<Title>[^']+'?.*)\s*$
在这种情况下,这个正则表达式似乎可以正常工作:

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!");
}
但有时我的数据包含类似的示例,这些示例似乎与上面的模式不匹配:

Saki - 'Esme'
Saki - 'The Unrest Cure' (Second Edition)
Saki (File Under: Hector Hugh Munro) - 'The Interlopers' (Anniversary Multi-pack)
William Faulkner - 'The Sound and the Fury' (Collector's Re-issue)
'The Sound and the Fury'
The Sound and the Fury
The Bible (St James Version)
在所有不存在连字符的情况下,这些都是没有作者的书名。我没有发现任何作者的名字出现时没有书名的情况


如何更改正则表达式以正确处理此问题?

我不会尝试使用单个正则表达式来处理此问题。相反,我会使用正则表达式的序列(或树)来测试各种可选语法,以某种顺序给出最佳结果。而且,我要明确指出,可能有一些输入集的结果并不完美。。。无论您使用什么样的启发式方法。

我都不会尝试使用一个正则表达式来实现这一点。相反,我会使用正则表达式的序列(或树)来测试各种可选语法,以某种顺序给出最佳结果。而且,我要明确指出,可能有一些输入集的结果并不完美。。。无论您使用何种启发式方法。

此正则表达式匹配您描述的所有情况:

  ^\s*(?:(.*)\s+-\s+)?'?([^']+'?.*)\s*$
作为Java字符串,它是:
“^\\s*(?:(.*)\\s+-\\s+?”?([^']+'?*)\\s*$”

如果使用JDK7,则可以使用如下命名捕获组:

William Faulkner - 'Light In August'
William Faulkner - 'Sanctuary'
William Faulkner - 'The Sound and the Fury'
  ^\s*(?:(?<Author>.*)\s+-\s+)?'?(?<Title>[^']+'?.*)\s*$
^\s*(?:(?*)\s+-\s+?(?[^']+'?*)s*$

其中
此正则表达式匹配您描述的所有情况:

  ^\s*(?:(.*)\s+-\s+)?'?([^']+'?.*)\s*$
作为Java字符串,它是:
“^\\s*(?:(.*)\\s+-\\s+?”?([^']+'?*)\\s*$”

如果使用JDK7,则可以使用如下命名捕获组:

William Faulkner - 'Light In August'
William Faulkner - 'Sanctuary'
William Faulkner - 'The Sound and the Fury'
  ^\s*(?:(?<Author>.*)\s+-\s+)?'?(?<Title>[^']+'?.*)\s*$
^\s*(?:(?*)\s+-\s+?(?[^']+'?*)s*$

这里
几乎是时候讨论真正的解析器了。但正如Stephen所建议的那样,您现在可能可以使用多个正则表达式。@bernace-我认为“真正的”解析器在这里不会有帮助。这里的问题似乎是输入没有正式语法,而实际语法是不明确的。现在几乎是时候讨论真正的解析器了。但正如Stephen所建议的那样,您现在可能可以使用多个正则表达式。@bernace-我认为“真正的”解析器在这里不会有帮助。这里的问题似乎是输入没有正式语法,而实际语法是不明确的http://www.regexplanet.com/simple/
http://myregexp.com/
以《吉姆·克拉克和奥斯卡·王尔德》为例,它工作得非常完美。我认为,之所以抛出
NullPointerException
,是因为如果文本没有作者信息,那么第一组将为null。要解决这个问题,您应该确保要使用的组不为null。您可以捕获
NullPointerException
和,除非使用if条件。有关更多信息,请阅读
http://efreedom.com/Question/1-2931065/Handle-NullPointerException-Java
。我已经在
http://www.regexplanet.com/simple/
http://myregexp.com/
以《吉姆·克拉克和奥斯卡·王尔德》为例,它工作得非常完美。我认为,之所以抛出
NullPointerException
,是因为如果文本没有作者信息,那么第一组将为null。要解决这个问题,您应该确保要使用的组不为null。您可以捕获
NullPointerException
和,除非使用if条件。有关更多信息,请阅读
http://efreedom.com/Question/1-2931065/Handle-NullPointerException-Java