我正在尝试将文本文件中的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);
}
}
答案 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)
匹配区分大小写。
如果要删除空格,请使用
中的trimstr.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循环块。