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)<