无法从Java中的字符串中删除返回和/或换行符
我试图解决的问题要求我读入一个文本文件,并将文件中的所有单词分离为存储在ArrayList中的不同“Token”对象,不应存储空格或换行符。当前代码:无法从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("\\
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" }