从文件中读取字符串

时间:2013-04-28 01:11:28

标签: java minecraft

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

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

[日期和时间] John Test Dog

[日期和时间] Mary Test3 Moo

所以我得到了用户输入,让我们说它是测试。我需要让下面的读者只搜索文件中的所有行" test"并发送它背后的整条线。但是当我用我现在所拥有的东西做它时,它会发回"测试"和" test3"。也是"测试"的位置在字符串中将始终相同。

我很抱歉这么模糊,我还是很新。

以下是我的读者:

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

2 个答案:

答案 0 :(得分:2)

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

制作一个java.util.StringTokenizer和一个标志,以确保所有令牌都匹配。在使用等于

的令牌匹配循环中
 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
 }

使用

str.toLowerCase().equals(u)

无需调用String.valueOf,因为您已经有了一个字符串。也是你的小写,所以测试和测试将匹配,如果你是小写,str是'测试'或'测试'......

使用     str.equals(U)

匹配区分大小写。

如果要删除空格,请使用

中的trim
str.trim()

OR

str.trim().toLowerCase()

请注意,如果您不止一次地使用修剪或小写字符串,最好将该值分配给新变量并使用新变量。

String sTrmed = str.trim();
if(sTrmed.equals(u))   { //....

答案 1 :(得分:1)

您可以使用正则表达式。例如,使用这样的代码块:

//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循环块。