我正在梳理我的编码技巧,并解决我在网上找到的一些简单问题。特定的任务是输入一个包含任意行数的txt文件,并让程序检查每一行并返回“True”或“False”,具体取决于该行是否包含字母表中的所有26个字母。我觉得我差不多完成了,但是我的正则表达式将字符串与[a-z]匹配,无论我做什么都会返回false。我已经尝试将字符串更改为小写,删除空格,似乎没有任何工作。
Here's a link to the project as well.
我目前在文本文件中的文字是“快速的棕色狐狸跳过懒狗。”
package easy139;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class easy139 {
public static void main(String[] args) {
try {
Scanner in = new Scanner(new FileReader("input.txt"));
while (in.hasNextLine()) {
String line = in.nextLine();
System.out.println(line);
String noSpaces = line.replaceAll(" ","");
if (noSpaces.matches("[a-z]")) {
System.out.println("True");
}
else {
System.out.println("False");
}
}
in.close();
} catch (IOException e) {
}
}
}
答案 0 :(得分:3)
您的测试返回false,因为正则表达式[a-z]
表示"恰好是一个字母"。
与String.matches()
一起使用的正则表达式是:
(?i)(?=.*a)(?=.*b)(?=.*c)...(?=.*z).*
这使用了每个字母的前瞻,每个字母都断言字母存在。 (?i)
开关打开不区分大小写。
答案 1 :(得分:0)
这是一个非基于正则表达式的解决方案,如果您对它感兴趣:
public static void main(String[] args) throws Exception {
Set<Character> letters = new HashSet<>();
Scanner in = new Scanner(new FileReader("input.txt"));
try {
while (in.hasNextLine()) {
letters.clear();
for (char c : in.nextLine().toCharArray()) {
if (Character.isLetter(c)) letters.add(toLowerCase(c));
}
System.out.println(letters.size() == 26);
}
} finally { in.close(); }
}
答案 2 :(得分:0)
在新方法中提取并循环遍历所有字符:
static boolean containsAllCharacters(String line) {
if (line.length() < 26) {
// if string is less than 26 characters long,
// it won't hold all characters in it
return false;
}
for (char c = 'a'; c <= 'z'; c++) {
if (line.indexOf(c) == -1) {
return false;
}
}
return true;
}
然后你可以这样称呼它:
String line = in.nextLine();
System.out.println(line);
System.out.println(containsAllCharacters(line) ? "TRUE" : "FALSE");