2

我正在尝试将文本文件中的字符串与来自用户输入的字符串进行匹配。我可以使用带有 的 while 循环找到并显示它if (String.valueOf(str).toLowerCase().contains(u)),但是说我有一行带有 test 和下一行带有 test3 它将打印两行。我需要它做的是搜索只是测试并打印它所在的行而不打印 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);
    }
}
4

2 回答 2

2

你说你有很多元素(令牌)要匹配。所以你有“bob”、“John”等,我猜它们可以在文件中按任何顺序排列,但都应该在同一行。

制作一个java.util.StringTokenizer和一个标志以确保所有令牌都匹配。在循环中使用 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
 }

利用

str.toLowerCase().equals(u)

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

使用 str.equals(u)

匹配大小写敏感。

如果要删除空格,请使用 trim ,如

str.trim()

或者

str.trim().toLowerCase()

请注意,如果您要多次使用修剪或小写的字符串,最好将值分配给新变量并使用新变量。

喜欢

String sTrmed = str.trim();
if(sTrmed.equals(u))   { //....
于 2013-04-28T01:17:47.413 回答
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-loop 块。

于 2013-04-28T03:01:07.450 回答