我的情况是我从包含特殊字符的文件中读取,如$ @%!与空间一起。例如:
I_am_here !!!确实,__ am_I_here?
在上面的字符串中,我显示了一个带下划线的空格,只是为了表明我可以遇到多个空格(比如前两个)以及特殊字符。所以我只是使用_作为视觉辅助。在真实文件中,它实际上是一个空格或多个空格。
如何从输入中读取此文件并跟踪它们。是否可以隔离特殊字符和空格,并将它们与读取的单词一起打印到输出中。我想简而言之,我想保留特殊字符和空格,同时修改程序读取的单词。
例如输入字符串:
I_am_here !!!确实,__ am_I_here?
会变成:
I_am_here !!!确实,__ 2_I_2?
这里我正在读取输入字符串,计算多次出现的单词并打印出输出以及原始输入中出现的空格和特殊字符。我怎么能用Java做到这一点?感谢
答案 0 :(得分:0)
要查找字符串中的单词,最简单的方法是使用正则表达式。正则表达式\p{L}+
将找到一个或多个Unicode字母的任何序列。
要使用在找到单词之前不知道的值替换此类单词,您可以使用用于查找的appendReplacement()
的appendTail()
和Matcher
方法单词。
由于您想要计算之前看过的单词的次数,您可以使用Map<String, Integer>
来维护已经看过的单词的地图,以及到目前为止已经看过多少次的计数。
这是如何运作的:
String input = "I am here!!! really, am I here? Why, yes I really am!";
Map<String, Integer> wordCount = new HashMap<>();
StringBuffer buf = new StringBuffer();
Matcher m = Pattern.compile("\\p{L}+").matcher(input);
while (m.find()) {
String word = m.group();
Integer count = wordCount.get(word);
if (count == null)
wordCount.put(word, 1);
else {
wordCount.put(word, ++count);
m.appendReplacement(buf, count.toString());
}
}
String output = m.appendTail(buf).toString();
System.out.println(input);
System.out.println(output);
<强>输出强>
I am here!!! really, am I here? Why, yes I really am!
I am here!!! really, 2 2 2? Why, yes 3 2 3!