当前位置: 首页 > 知识库问答 >
问题:

匹配字符串中的所有字母

郑宏朗
2023-03-14

我试图找出我的字符串是否包含从a到z的所有字母

Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
s=s.replaceAll("\\s+", "");
System.out.println(s);
// String input = "[a-zA-Z]+";
String input = "\\w+";
System.out.println(input);
Pattern pr = Pattern.compile(input);
Matcher m =pr.matcher(s);
if(m.matches()){
    System.out.println("pangram");
} else {
    System.out.println("non-pangram");
}

我们可以通过其他方法解决这个问题,但我正在尝试仅使用模式和匹配器来解决它。

共有2个答案

戚锦
2023-03-14

我使用了set并将每个字符(ASC)放入其中,因为set只包含唯一的值,所以我检查所有字符的大小==26。使用if(put

 Scanner sc = new Scanner(System.in);
    String s= sc.nextLine();
    Set<Integer> h = new HashSet<Integer>();
        for (int i = 0; i < s.length(); i++) {
            int put = (int)s.charAt(i);
            if(put>=97 && put<=122 ) {
                h.add(put);
            }
            if(put>=65 && put<=90 ) {
                h.add(put);
            }
        }
        if(h.size()==52)
            System.out.println("all 52");
        else
            System.out.println("missing");
陆俊智
2023-03-14

如果您想查看给定输入字符串中是否存在所有52个大小写字母,则不能使用正则表达式。它根本不能做这样的事情。

如果必须存在的字符列表是动态的,则可以使用此方法:

private static boolean containsAllOf(String input, String alphabet) {
    boolean[] found = new boolean[alphabet.length()];
    int foundCount = 0;
    for (int i = 0; i < input.length(); i++) {
        char ch = input.charAt(i);
        int idx = alphabet.indexOf(ch);
        if (idx >= 0 && ! found[idx]) {
            found[idx] = true;
            if (++foundCount == found.length)
                return true;
        }
    }
    return false;
}

例如。像这样使用它:

containsAllOf("abc", "abcdef")                  // returns false
containsAllOf("dfu hadkf kojuhoeuaf", "abcdef") // returns false
containsAllOf("bad fed", "abcdef")              // returns false
containsAllOf("bad fec", "abcdef")              // returns true

如果您特别想检查英语字母表的全部52个大小写字母,则可以提高性能。

private static boolean containsAllOfAlphabet(String input) {
    boolean[] found = new boolean[52];
    int foundCount = 0;
    for (int i = 0; i < input.length(); i++) {
        char ch = input.charAt(i);
        int idx = (ch >= 'a' && ch <= 'z' ? ch - 'a' :
                   ch >= 'A' && ch <= 'Z' ? ch - 'A' + 26 : -1);
        if (idx >= 0 && ! found[idx]) {
            found[idx] = true;
            if (++foundCount == found.length)
                return true;
        }
    }
    return false;
}

如果要使用模式匹配器,请更新,这里有一种方法。

首先对输入字符串的所有字符进行排序,然后使用模式匹配器消除所有非字母和重复字母。如果结果的长度为52,则所有字母都存在。

当然,pangram通常不会将大小写字母视为不同的,因此调用toLowercase()并检查长度26可能更正确:

String input = "Pack my box with five dozen liquor jugs.";

char[] buf = input.toLowerCase().toCharArray();
Arrays.sort(buf);
boolean pangram = (new String(buf).replaceAll("[^a-zA-Z]|([a-zA-Z])\\1+", "$1").length() == 26);
System.out.println(pangram ? "pangram" : "non-pangram");
 类似资料:
  • 本文向大家介绍C#程序来匹配字符串中的所有数字,包括了C#程序来匹配字符串中的所有数字的使用技巧和注意事项,需要的朋友参考一下 要匹配字符串中的所有数字,请使用C#正则表达式。 首先,设置一个数字字符串- 使用以下正则表达式获取字符串中的数字- 以下是代码- 示例 输出结果

  • 我有一些xml文件,希望删除除特定字符串以外的所有内容。 StackOverflow上还有很多类似的问题,但都不适用于我的文件,在尝试了几个小时不同的正则表达式后,我想寻求帮助。 到目前为止,部分成功但并非完全成功的最接近的正则表达式是: xml文件的示例: 我使用regex101,因此可以将示例粘贴在那里,以了解为什么rex只能部分工作。简而言之,它与第一次出现的不匹配,但与第二次出现的匹配。我

  • 问题内容: 如何替换字符串中所有出现的内容? 如果要替换字符串中的所有换行符(\ n)。 这只会替换第一次出现的换行符 我不知道该怎么做? 问题答案: 使用全局标志。

  • 问题 你想要匹配两个或多个字符串。 解决方案 计算把一个字符串转换成另一个字符串所需的编辑距离或操作数。 levenshtein = (str1, str2) -> l1 = str1.length l2 = str2.length prevDist = [0..l2] nextDist = [0..l2] for i in [1..l1] by 1

  • 本文向大家介绍Python中的DI字符串匹配,包括了Python中的DI字符串匹配的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个仅包含“ I”(表示增加)或“ D”(表示减少)的字符串S,令N = S的大小。我们必须返回[0,1,... ,N]使得对于范围0,...,N-1中的所有i- 如果S [i]为“ I”,则A [i] <A [i + 1] 否则,当S [i]为“ D”时,则A [

  • 所需匹配: 这个regex只匹配字符串第一个实例之后的所有内容: 思想?