无法从Java中的字符串中删除返回和/或换行符

无法从Java中的字符串中删除返回和/或换行符,java,regex,string,replace,newline,Java,Regex,String,Replace,Newline,我试图解决的问题要求我读入一个文本文件,并将文件中的所有单词分离为存储在ArrayList中的不同“Token”对象,不应存储空格或换行符。当前代码: String[] tokenArray = line.split("\\s+"); 删除字符串中的所有空格,但无法删除新行/换行符 我尝试在.split()方法之前的行上分别运行这两行,以便删除新行,但它们不起作用 line = line.replaceAll("\\r|\\n", ""); line = line.replaceAll("\\

我试图解决的问题要求我读入一个文本文件,并将文件中的所有单词分离为存储在ArrayList中的不同“Token”对象,不应存储空格或换行符。当前代码:

String[] tokenArray = line.split("\\s+");
删除字符串中的所有空格,但无法删除新行/换行符

我尝试在.split()方法之前的行上分别运行这两行,以便删除新行,但它们不起作用

line = line.replaceAll("\\r|\\n", "");
line = line.replaceAll("\\R+", "");
下面是整个方法

public void tokenizeFile(String filePath) throws IOException
{
    String line = "";
    FileReader file = new FileReader(filePath);
    BufferedReader read = new BufferedReader(file);
    tokens.clear();
    keywords = 0;
    while((line = read.readLine()) != null)
    {
        String[] tokenArray = line.split("\\s+");
        for(int i = 0; i < tokenArray.length; i++)
        {
            Token newToken = new Token(tokenArray[i]);
            this.tokens.add(newToken);
            keywords++;
        }
    }
    read.close();
}
这是输出文件的内容(writeTokens()写入的内容):

全文参考:

Token.java

public class Token
{
    private String token;

    public String getValue()
    {
        return token;
    }
    public void setValue(String token)
    {
        this.token = token;
    }
    public Token()
    {

    }
    public Token(String s)
    {
        this.token = s;
    }
    @Override
    public String toString()
    {
        return String.format(token);
    }
}
Tokenizer.java

public class Token
{
    private String token;

    public String getValue()
    {
        return token;
    }
    public void setValue(String token)
    {
        this.token = token;
    }
    public Token()
    {

    }
    public Token(String s)
    {
        this.token = s;
    }
    @Override
    public String toString()
    {
        return String.format(token);
    }
}
Driver.java

public class Driver
{
    public static void main(String[] args)
    {
        try
        {
            Tokenizer tokenizer = new Tokenizer();
            tokenizer.tokenizeFile("input.txt");
            tokenizer.writeTokens();
        } 
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
编辑:更新以回复评论

使用:

String[] tokenArray = line.split("\\R");
String[] tokenArray = line.split("(\\W+)");
产出:

The cat in the    hat



one fish two fish    red fish   blue    fish
使用:

String[] tokenArray = line.split("\\R");
String[] tokenArray = line.split("(\\W+)");
收益率:

cat
in
the
hat



one
fish
two
fish
red
fish
blue
fish
我的IDE是vs代码,我正在使用集成终端进行编译

bash-3.2$ javac Driver.java
bash-3.2$ java Driver
bash-3.2$ cat output.txt

尝试更改正则表达式

String[]tokens=line.split(“\\W+”);
UPD: 使用jshell,我得到了以下输出:

jshell> String fileContents = new String(Files.readAllBytes(Paths.get("input")));
fileContents ==> "The cat in the      hat\n\none fish two fish    red fish   blue    fish\n"

jshell> fileContents.split("(\\W+)");
$2 ==> String[13] { "The", "cat", "in", "the", "hat", "one", "fish", "two", "fish", "red", "fish", "blue", "fish" }


这比看起来容易

split(\\s+”)
提供了一个关于空格拆分的数组:空格和制表符。 这样做的一个问题是,一行可能以空格开头或结尾,因此也会给出空字符串

对于新行:有许多行分隔符,
\r
r\n
\n
,NEL(
\u0085
)。在regex中引入了
“\\R”

但是,
readLine()
智能地生成不带行分隔符的行。
这就解决了所有问题。

刚刚尝试用该正则表达式重新编译,但它仍然生成相同的输出。我真的不知道为什么;我用这个正则表达式得到了正确的输出,更新了答案我也不明白,我花了几个小时研究类似的问题和答案,似乎没有什么东西能删除换行符,即使使用特定的正则表达式删除换行符。我在.split()方法中尝试了正则表达式“\\R”和“\\R+”,但它们产生了错误的输出。也许我对你的答案解释不正确。很抱歉不清楚:reeadLine去掉了换行符序列,所以
line
不需要在换行符上拆分。
jshell> String fileContents = new String(Files.readAllBytes(Paths.get("input")));
fileContents ==> "The cat in the      hat\n\none fish two fish    red fish   blue    fish\n"

jshell> fileContents.split("(\\W+)");
$2 ==> String[13] { "The", "cat", "in", "the", "hat", "one", "fish", "two", "fish", "red", "fish", "blue", "fish" }