Java的Scanner可以按照正则读取吗
时间: 2024-09-16 12:02:51 浏览: 31
是的,Java的`Scanner`类支持按照正则表达式进行读取。你可以使用`useDelimiter()`方法配合一个正则表达式作为分隔符,来指定从输入源中提取特定模式的数据。例如,如果你想读取直到遇到数字为止的一段字符串,可以这样做:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\\D+"); // 使用非数字字符作为分隔符
String token = scanner.next(); // 会读取到第一个数字前的所有字符
System.out.println("Read string until first number: " + token);
scanner.close();
}
}
```
在这个例子中,`\D`匹配任何非数字字符,`next()`方法将返回一个只包含数字的字符串。
相关问题
Java编程使用Scanner类和正则表达式统计一篇英文中的单词,要求如下:从文件中读取英文, 统计一共出现了多少个单词。 统计有多少个互不相同的单词。 按单词出现频率的大小输出单词,频率显示为三位小数
您好,根据您的要求,我可以帮您解答Java编程使用Scanner类和正则表达式统计一篇英文中的单词的问题。
首先,您需要通过Scanner类读取文件中的文本,并将其存储到字符串中。可以使用如下代码:
```
Scanner scanner = new Scanner(new File("file.txt"));
String text = scanner.useDelimiter("\\Z").next();
```
上述代码将读取名为file.txt的文件中的所有文本,将其存储到text字符串中。
接下来,您可以使用正则表达式来分割单词,并将其存储到一个字符串数组中。可以使用如下代码:
```
String[] words = text.split("[^a-zA-Z']+");
```
上述代码将使用正则表达式[^a-zA-Z']+来分割文本,将单词存储到words字符串数组中。该正则表达式匹配所有不是字母和单引号的字符。
接下来,您可以使用HashMap来存储单词出现的次数。可以使用如下代码:
```
HashMap<String, Integer> wordCounts = new HashMap<String, Integer>();
for (String word : words) {
if (wordCounts.containsKey(word)) {
wordCounts.put(word, wordCounts.get(word) + 1);
} else {
wordCounts.put(word, 1);
}
}
```
上述代码将遍历words数组中的所有单词,并将其存储到HashMap中。如果HashMap已经包含该单词,则将其出现次数加1;否则,将该单词添加到HashMap中,并将其出现次数设置为1。
接下来,您可以计算出文本中一共出现了多少个单词,以及有多少个互不相同的单词。可以使用如下代码:
```
int totalWords = 0;
int uniqueWords = 0;
for (Integer count : wordCounts.values()) {
totalWords += count;
if (count == 1) {
uniqueWords++;
}
}
```
上述代码将遍历HashMap中的所有值,并计算出文本中一共出现了多少个单词。同时,如果某个单词出现的次数为1,则将uniqueWords的值加1,表示有一个新的互不相同的单词。
最后,您可以按单词出现频率的大小输出单词,并将频率显示为三位小数。可以使用如下代码:
```
ArrayList<Map.Entry<String, Integer>> sortedWordCounts = new ArrayList<Map.Entry<String, Integer>>(wordCounts.entrySet());
Collections.sort(sortedWordCounts, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b) {
return b.getValue().compareTo(a.getValue());
}
});
for (Map.Entry<String, Integer> entry : sortedWordCounts) {
double frequency = (double)entry.getValue() / (double)totalWords;
System.out.println(entry.getKey() + " - " + String.format("%.3f", frequency));
}
```
上述代码将把HashMap中的所有键值对(即单词及其出现次数)存储到ArrayList中,并按照出现次数的大小对其进行排序。然后,遍历排序后的ArrayList中的所有键值对,计算出单词出现的频率,并输出单词及其频率。
希望这些代码可以帮到您!
用Java使用Scanner类和正则表达式解析字符串"数学:87.5分,物理:76.5分,英语:97分"中的考试成绩,并计算出总成绩,其中课程门数和课程名不确定。 输入为一字符串,输出为浮点数,精确度一位小数。
可以使用Java的Scanner类和正则表达式来解析字符串,具体代码如下:
```java
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入考试成绩:");
String input = scanner.nextLine();
Pattern pattern = Pattern.compile("(\\d+(\\.\\d+)?)分");
Matcher matcher = pattern.matcher(input);
double totalScore = 0.0;
while (matcher.find()) {
double score = Double.parseDouble(matcher.group(1));
totalScore += score;
}
System.out.printf("总成绩为:%.1f\n", totalScore);
}
}
```
这个程序首先创建了一个Scanner对象,用来读取用户输入的字符串。然后使用正则表达式匹配字符串中的考试成绩,将每个成绩解析为一个浮点数并累加到总成绩中。最后输出总成绩。
运行程序,输入字符串"数学:87.5分,物理:76.5分,英语:97分",输出结果为:261.0。
阅读全文