gpt4 book ai didi

java - 为什么此正则表达式在单个用例上失败 - 包含&符号的文本字符串?

转载 作者:行者123 更新时间:2023-11-29 04:00:21 29 4
gpt4 key购买 nike

我试图找到一个正则表达式从数据集中分离出作者和书名信息。

这个似乎工作正常:

^\s*(?:(.*)\s+-\s+)?'?([^']+'?.*)\s*$

在下面的数据中,它将组 1 中的作者标识为第一个连字符之前的文本,并且在没有连字符的情况下,它标识第 2 组 中的书名:

William Faulkner - 'Light In August'
William Faulkner - 'Sanctuary'
William Faulkner - 'The Sound and the Fury'
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)

但是,对于以下包含 & 符号的字符串,它会失败:

'Jim Clarke & Oscar Wilde'

有人可以解释为什么它在这里不起作用吗?

更新:

这里是相关的Java代码:

Pattern pattern = Pattern.compile("^\\s*(?:(.*)\\s+-\\s+)?'?([^']+'?.*)\\s*$");
Matcher matcher = pattern.matcher(text);
if(!matcher.matches())
{
logFailure(text);
}
else
{
String author = matcher.group(1).trim();
String bookTitle = matcher.group(2).trim();
}

NullPointerException 在上面摘录的以下行中被抛出:

    String author = matcher.group(1).trim();

最佳答案

matcher.group(1) 在没有连字符时返回 null,因此 .trim() 抛出 NPE。

您当前的正则表达式也会吃掉它找到的第一个单引号。另外,你真的不想匹配吗?你只是在那里登录。如果 text 实际上不必匹配模式,您可以使用更简单的算法。

int hyphenIndex = text.indexOf("-");
if (hyphenIndex > -1) {
String author = text.substring(0, hyphenIndex);
System.out.println(author);
}
String title = text.substring(hyphenIndex + 1, text.length());
System.out.println(title);

但是,如果您确实需要拒绝某些字符串,您可能还可以做一些事情来使其更具可读性。

  1. 将正则表达式更改为 "^(?:(.*)\\s+-\\s+)?'?([^']+'?.*)$" 并调用 pattern.matcher(text.trim())

关于java - 为什么此正则表达式在单个用例上失败 - 包含&符号的文本字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3969130/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com