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
。