Java 无法从文件中读取字符串

Java 无法从文件中读取字符串,java,minecraft,Java,Minecraft,我正在尝试将文本文件中的字符串与用户输入的字符串进行匹配。我可以使用while循环找到并显示它,如果(String.valueOf(str.toLowerCase().contains(u)), 但是假设我有一行test,下一行test3,它将打印这两行。我需要它做的是只搜索test并打印它所在的行,而不打印test3 对不起,我不太擅长描述这个。问题是: 我有一个类,它使用StringBuilder()将数组写入这样的文本文件 [日期和时间]约翰测试狗 [日期和时间]Mary Test3 Mo

我正在尝试将文本文件中的字符串与用户输入的字符串进行匹配。我可以使用while循环找到并显示它,如果(String.valueOf(str.toLowerCase().contains(u)), 但是假设我有一行test,下一行test3,它将打印这两行。我需要它做的是只搜索test并打印它所在的行,而不打印test3

对不起,我不太擅长描述这个。问题是: 我有一个类,它使用
StringBuilder()
将数组写入这样的文本文件

[日期和时间]约翰测试狗

[日期和时间]Mary Test3 Moo

所以我得到了用户的输入,假设它是测试。我需要让下面的阅读器搜索文件中的所有行,只搜索“test”,然后发送后面的整行内容。但是当我用我现在拥有的东西做这件事时,它会发回“test”和“test3”的行。此外,“test”在字符串中的位置始终相同

抱歉说得这么含糊,我还是个新手

这是我的自动取款机:

Reader reader = new FileReader("EzRegion.txt");
BufferedReader in = new BufferedReader(reader);

while ((str = in.readLine()) != null) 
{
    if (String.valueOf(str).toLowerCase().contains(u)) 
    {
        sender.sendMessage(ChatColor.YELLOW + str);
    }
}

你说你有很多元素(记号)要匹配。所以你有“鲍勃”,“约翰”等等,我猜他们可以在文件中的任何顺序,但都应该在同一行

创建一个和一个标志以确保所有令牌匹配。在令牌的循环中使用equals进行匹配

 StringTokenizer st = new StringTokenizer(str);
 boolean matchFlag = true;
 while (st.hasMoreTokens()) {
    String s3 = st.nextToken().toLowerCase();
    String match = u.trim().toLowerCase();
    if(!u.equals(s3)){
            matchFlag = false;
            //logger
 }
使用

无需调用String.valueOf,因为您已经有一个字符串。如果u是小写,str是“test”或“test”,那么test和test也会匹配

使用 str.equals(u)

匹配区分大小写

如果要删除空格,请使用修剪,如中所示

str.trim()

注意:如果要多次使用修剪字符串或小写字符串,最好将值赋给新变量并使用新变量


可以使用正则表达式。例如,使用如下代码块:

//str (e.g. "[Date and Time] John Test3 Dog")
String u = "test"; //whatever you are looking for
String REGEX = "\\b"+t.toLowerCase()+"\\b" ; //look for the exact word
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(str.toLowerCase());
if (m.find()) //if you are after multiple instances, then it needs to be replaced by a while-loop
{
    //your code here:
    System.out.println("start(): " + m.start());
    System.out.println("end(): " + m.end());

    sender.sendMessage(ChatColor.YELLOW + str);
}
else
    System.out.println("No match found");

我认为,您需要这样的内容才能进入while循环块。

很抱歉,我忘记了将(u)与其他字符串(如bob john test moo so.equals())一起包含在一行中,例如test无法工作,因为整行不匹配。请编辑并添加更多信息以解决问题或浪费时间。您必须忽略“test3”。为什么?根据什么?什么规则适用?你还必须忽略什么?
str.trim().toLowerCase()
String sTrmed = str.trim();
if(sTrmed.equals(u))   { //....
//str (e.g. "[Date and Time] John Test3 Dog")
String u = "test"; //whatever you are looking for
String REGEX = "\\b"+t.toLowerCase()+"\\b" ; //look for the exact word
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(str.toLowerCase());
if (m.find()) //if you are after multiple instances, then it needs to be replaced by a while-loop
{
    //your code here:
    System.out.println("start(): " + m.start());
    System.out.println("end(): " + m.end());

    sender.sendMessage(ChatColor.YELLOW + str);
}
else
    System.out.println("No match found");