正则表达式检查字母表中的所有字母

时间:2014-04-16 13:04:35

标签: java regex expression replaceall

我正在梳理我的编码技巧,并解决我在网上找到的一些简单问题。特定的任务是输入一个包含任意行数的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) {
        }
    }
}

3 个答案:

答案 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");