Java 程序中的正则表达式不';行不通

Java 程序中的正则表达式不';行不通,java,regex,filereader,Java,Regex,Filereader,我正在编写一个程序,它将读取一个文本文件,如果文本中有任何不是空格或单词字符的字符,就会抛出一个错误。正则表达式似乎正确,但不起作用 例如,这些文本: 哈利波特$ 哈利波特 &&&&&&&&&&&&&&&&&uvuoyvouyvouyv78789***** 在控制台中显示,无错误 我也检查了上的正则表达式 需要Double\是因为otherwis,e I获取错误非法转义字符 import java.io.*; 公共级DZ{ 公共静态void main(字符串[]args)引发IOExcept

我正在编写一个程序,它将读取一个文本文件,如果文本中有任何不是空格或单词字符的字符,就会抛出一个错误。正则表达式似乎正确,但不起作用

例如,这些文本:

  • 哈利波特$
  • 哈利波特
  • &&&&&&&&&&&&&&&&&uvuoyvouyvouyv78789*****
在控制台中显示,无错误

我也检查了上的正则表达式

需要Double\是因为otherwis,e I获取错误非法转义字符

import java.io.*;
公共级DZ{
公共静态void main(字符串[]args)引发IOException{
试一试{
System.out.println(方法());
}捕获(例外e){
系统输出打印ln(e);
}
}
公共静态布尔比较(char wrt){
字符串str=“[^\\s\\w]”;
对于(int i=0;i
您正在将
字符串
字符
进行比较,并在包含正则表达式的字符串上进行迭代-这没有意义:

public static boolean compare(char wrt){
    String str = "[^\\s\\w]";
    for(int i=0;i<str.length();i++){ //why are you diong this?
        if(str.charAt(i) == wrt) //you are checking every char of the regex agains the input char!
            return true;
    }
    return false;
}

此外,在第一次发现无效字符时,最好停止读取文件。否则,检查每个
char
而不是整个文件内容(如
content.matches(“.[^\\s\\w].])是没有意义的
。只抛出一次异常,然后
中断;
读取文件的循环!

在上面的代码中,您对每个字符进行迭代,相反,您可以使用模式匹配输入文件中的每一行

public static boolean compare(String wrt)
{
    Pattern regex = Pattern.compile("[^\\s\\w]");

    Matcher matcher = regex.matcher(wrt);
    return matcher.find();
}

public static StringBuilder method() throws Exception
{
    FileReader fr = new FileReader("/Users/rachel_green/Documents/1.txt");

    BufferedReader bR = new BufferedReader(fr);
    StringBuilder str = new StringBuilder();
    String line;
    while ((line = bR.readLine()) != null)
    {
        if (compare(line))
        {
            throw new Exception("Wrong file format");
        }
        else
        {
            str.append(line);
        }
    }
    return str;
}

希望这有帮助。

为什么要迭代正则表达式中的每个字符,并将其与源文本中的字符进行比较?如果(str.charAt(i)=wrt)有什么作用?你为什么这么认为?
可以更改为“[\\S\\W]”
,这将使正则表达式与所有非空格匹配(正如
\W
\S
的子集一样)。请注意
[^\\S\\W]
就像
不是(\S或\W)
,如果你想使用
\S
\W
的话,根据德摩根定律,应该看起来像
不是(\S)而不是(\W)
,所以更像
[\S]&[\W]
(我们可以去掉内括号
)。
[\\W\\S]
代表的是
不是(\W)或不是(\S)
。谢谢,这是有效的:)不过我在正则表达式中使用了这个“[^\\W\\S]”。@Pshemo你说得对,谢谢你指出这一点。我应该考虑两次。从答案中删除!
public static boolean compare(String wrt)
{
    Pattern regex = Pattern.compile("[^\\s\\w]");

    Matcher matcher = regex.matcher(wrt);
    return matcher.find();
}

public static StringBuilder method() throws Exception
{
    FileReader fr = new FileReader("/Users/rachel_green/Documents/1.txt");

    BufferedReader bR = new BufferedReader(fr);
    StringBuilder str = new StringBuilder();
    String line;
    while ((line = bR.readLine()) != null)
    {
        if (compare(line))
        {
            throw new Exception("Wrong file format");
        }
        else
        {
            str.append(line);
        }
    }
    return str;
}