我使用BufferedReader
逐行读取文本文件。
我有一系列三个正则表达式来测试numbers
,capitals
和special chars
的每一行。
如果其中任何一个匹配,我将boolean
设置为true。
我想稍后使用这些布尔值向用户输出一条消息,告诉他们“扫描”的结果。
然而,当我来使用布尔值时,尽管我在测试文本文件中添加了数字,大写等,但它们仍被设置为假。
如果文本文件中的某一行是abC 6
,那么numBool
和capBool
应该返回true,而不是specialBool
import java.io.*;
import java.util.*;
import java.lang.*;
import java.awt.*;
class ReadFile implements Runnable
{
public void run()
{
String line;
Boolean capBool = false;
Boolean numBool = false;
Boolean specialBool = false;
try
{
/* ------------- Get Filename ------------- */
System.out.print("Enter file to scan : ");
BufferedReader fileGet = new BufferedReader(new InputStreamReader(System.in));
String file_name = fileGet.readLine();
fileGet.close();
/* ---------------- Open File ---------- */
BufferedReader br = new BufferedReader(new FileReader(file_name));
/* --------------- Scan file line by line ----------- */
while((line = br.readLine()) != null)
{
if(line.matches("[A-Z]"))
capBool = true;
if(line.matches("[0-9]"))
numBool = true;
if(line.matches("[$&+,:;=?@#|]"))
specialBool = true;
System.out.println(line);
}
br.close(); // close reader
DisplayResults display = new DisplayResults();
String findings = display.displayFindings(capBool, numBool, specialBool);
System.out.print(findings);
}
catch(IOException ex)
{
System.out.println(ex.getMessage() + " - Please check log file for more details");
ex.printStackTrace();
}
}
public static void main(String[] args) throws FileNotFoundException
{
System.setErr(new PrintStream(new FileOutputStream("Exceptions.txt")));
Runnable r = new ReadFile();
Thread th = new Thread(r);
th.start();
}
}
这是因为当我退出while循环时,以某种方式覆盖了布尔值吗?或者,由于正则表达式方法错误,它们是否永远不会被设置为真?
答案 0 :(得分:1)
matches
表示它的样子 - 检查整个字符串是否与正则表达式匹配。然而,从您编写这些正则表达式的方式来看,这并不是您最想要的 - 您似乎正在寻找的是一种regexy contains
。
然而,令人遗憾的是,没有其他漂亮的语法可以做你想做的事 - 请参阅How to use regex in String.contains() method in Java。你需要重写你的正则表达式。
它不应该那么难。只需使用.*
包围您准备好的表达式,即表示您要查找的内容可以在任意数量的字符之前或之后显示 - 即[A-Z]
可以更改为.*[A-Z].*