我试图找出如果我的字符串包含从a到z&的所有字母。 A到Z.我在下面尝试过:但如果它有aA
,它将返回true。我正在寻找所有52个字母,即如果字符串有全部52个字母,那么只有使用Pattern和matcher才能返回true,否则为false。
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");
}
我们可以通过其他方式解决这个问题,但我试图通过仅使用模式和匹配器来解决它。
答案 0 :(得分:1)
如果要查看给定输入字符串中是否存在所有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;
}
E.g。像这样使用它:
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");
答案 1 :(得分:-1)
我已经使用了set并将每个字符(ASC)放入其中,因为Set只包含唯一值,因此我检查所有字符的大小== 26。在添加之前使用if(put&gt; = 97&amp;&amp; put&lt; = 122)。
Scanner sc = new Scanner(System.in);
String s= sc.nextLine();
s = s.toLowerCase();
HashSet<Integer> h = new HashSet<Integer>();
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i)!=' '){
int put = (int)s.charAt(i);
h.add(put);
}
}
if(h.size()==26)
System.out.println("all 52");
else
System.out.println("missing");