Java 最后一个分隔符似乎错了

Java 最后一个分隔符似乎错了,java,regex,delimiter,Java,Regex,Delimiter,我有一个包含以下字符串的文本文件: I want to know. bye bye. I found you. I hate you. I hear you. 我要做的是在文件中搜索目标句子。 这是我使用的代码: public String lookFor(String target, File targetDestination) throws FileNotFoundException { Scanner scan = new Scanner(targetDestination);

我有一个包含以下字符串的文本文件:

I want to know. bye bye. I found you. I hate you. I hear you.
我要做的是在文件中搜索目标句子。 这是我使用的代码:

public String lookFor(String target, File targetDestination) throws FileNotFoundException {
    Scanner scan = new Scanner(targetDestination);

    scan.useDelimiter("\\. ");
    while (scan.hasNext()) {
        if (scan.next().compareTo(target) == 0)
            return target;
    }
    return "Sorry,(" + target + ") cannot be found!";
}
当我试图寻找任何句子时,例如:“我恨你”,它会返回“我恨你”,但当我试图返回最后一句话“我听到你”时,它会说它找不到,直到我添加一个点“我听到你”。然后它会返回它

有人能确切地解释发生了什么事吗?我觉得它是分隔符,但我对正则表达式知之甚少。

“\\”
是一个匹配点后跟空格的正则表达式

看看你的句子:

I want to know. bye bye. I found you. I hate you. I hear you.
              ↑        ↑            ↑           ↑
      dot followed by a space    dot followed by a space 
但是,如果最后一个点后面是“我听到了”,那么它后面就没有空格

注意:使用调试器将节省您的时间并使您更好地理解代码。

“\\\”
是一个匹配点后跟空格的正则表达式

看看你的句子:

I want to know. bye bye. I found you. I hate you. I hear you.
              ↑        ↑            ↑           ↑
      dot followed by a space    dot followed by a space 
但是,如果最后一个点后面是“我听到了”,那么它后面就没有空格


注意:使用调试器将节省您的时间,并使您更好地理解代码。

所有注释和答案都是正确的


您需要将分隔符regex更改为
“\\.\\s*”
,以允许在点后面有零个或任意数量的空格。

所有注释和答案都是正确的



您需要将分隔符正则表达式更改为
“\\.\\s*”
以允许在点后面有零个或任意数量的空格。

您知道
使用分隔符的作用吗<代码>\\
是一个正则表达式,它匹配一个点后跟一个空格。我必须这样做才能得到相同的句子。因为,当我在文本文件中键入一个要查找的句子时,我需要用后面的空格扫描该点,否则我必须在我查找@Marounso的句子之前加一个空格,你得到了你的答案:一个点本身并不是“一个点后跟一个空格”。因此,最后一个标记是
我听到了。
,而不是
我听到了
,因为最后一个点后面没有空格,因此不是分隔符。使用调试器将允许您自己查找它。@JBNizet我知道,但我需要在每次搜索之前包含一个空格。例如:“我听到你的声音”而不是
我听到你的声音
。这就是为什么我需要把点和空格放在一起。您可以简单地使用点作为分隔符,并在比较之前修剪标记。如果点后面有两个空格、一个制表符或一个行尾,那么这将有另外一个好处,那就是也可以工作。您知道
useDelimiter
的作用吗<代码>\\
是一个正则表达式,它匹配一个点后跟一个空格。我必须这样做才能得到相同的句子。因为,当我在文本文件中键入一个要查找的句子时,我需要用后面的空格扫描该点,否则我必须在我查找@Marounso的句子之前加一个空格,你得到了你的答案:一个点本身并不是“一个点后跟一个空格”。因此,最后一个标记是
我听到了。
,而不是
我听到了
,因为最后一个点后面没有空格,因此不是分隔符。使用调试器将允许您自己查找它。@JBNizet我知道,但我需要在每次搜索之前包含一个空格。例如:“我听到你的声音”而不是
我听到你的声音
。这就是为什么我需要把点和空格放在一起。您可以简单地使用点作为分隔符,并在比较之前修剪标记。如果点后面有两个空格,或者一个制表符,或者一行的结尾,这将有另外一个好处,也可以工作。相信我,我以前知道所有这些,并且我使用过很多次调试器,但是我必须使用点和空格,这样我可以单独键入目标句子,它将得到匹配。否则,我必须在我看的每个句子前留出一个空格for@fox由于
useDelimiter
接受正则表达式,您可以使用以下
\\.\\s*
。请您解释一下
\.\\s*
表达式的确切含义好吗?@fox
\.
匹配一个点,
\\s
匹配一个空格,
\\s*
表示什么意思“匹配零个或多个空格“。相信我,我以前知道所有这些,我使用过很多次调试器,但我必须使用带空格的点,这样我就可以单独键入目标句子,它就会得到匹配。否则,我必须在我看的每个句子前留出一个空格for@fox由于
useDelimiter
接受正则表达式,您可以使用以下
\\.\\s*
。请您解释一下
\.\\s*
表达式的确切含义好吗?@fox
\.
匹配一个点,
\\s
匹配一个空格,
\\s*
表示什么意思“匹配零个或多个空格”“非常感谢。这就是我要找的。请你解释一下正则表达式的具体功能,以便我能更好地理解它的功能happened@fox如果您的分隔符也影响
我离开美国
,并让您找到
我离开美国
A
?如果您需要避免拆分像
美国这样的首字母缩略词
,请使用
“\\。(?:\\S+)”
在这里,它将应用于后跟一个或多个空格的点或后跟行尾的点。
\s+
表示“1个或多个空格”、
$
表示“行尾”、
(?:X | Y)
表示“X或Y”,与
(X | Y)
相同,但执行速度更快。@Sashasalau感谢您的帮助。真聪明!非常感谢你。这就是我要找的。请你解释一下正则表达式的具体功能,以便我能更好地理解它的功能happened@fox如果您的分隔符也影响
我离开美国
,并让您找到
我离开美国
A
?如果您需要避免拆分像
美国这样的首字母缩略词
,请使用
“\\。(?:\\S+)”
此处,它将应用于后跟一个或多个空格的点或后跟行尾的点。
\s+
表示“1个或多个空格”,
$
表示“行尾”,
(?:X | Y)<