Java检查字符串是否仅包含英文键盘字母

问题描述

我要禁止用户名称中使用任何特殊字符。 他们应该能够使用整个英文键盘,所以

a-z,0-9,[],(),&,",%,$,^,°,#,*,+,~,§,.,-,',=,}{

,依此类推。因此,应该允许他们使用您可以用键盘输入的每个“正常”英文字符。

如何检查?

解决方法

我们可以做到:

String str = "My string";
System.out.println(str.matches("^[a-zA-Z][a-zA-Z\\s]+$"));//true

str = "My string1";
System.out.println(str.matches("^[a-zA-Z][a-zA-Z\\s]+$"));//false
,

使用 regex 将名称与英语字母匹配。

解决方案1:

if(name.matches("[a-zA-Z]+")) {
  // Accept name
}
else {
  // Ask to enter again
}

解决方案2:

while(!name.matches("[a-zA-Z]+")) {
  // Ask to enter again
  // Accept name
}
,

您可以为此使用regular expression

由于您在正则表达式中有很多具有特殊含义的字符,因此建议将它们放在单独的字符串中并用引号引起来:

String specialCharacters = "-[]()&...";
Pattern allowedCharactersPattern = Pattern.compile("[A-Za-z0-9" + Pattern.quote(specialCharacters) +  "]*");

boolean containsOnlyAllowedCharacters(String str) {
    return allowedCharactersPattern.matcher(str).matches();
}

关于首先如何获取特殊字符的字符串,无法列出用户可以使用当前键盘布局键入的所有字符。实际上,由于有type any Unicode character at all种方法,这样的列表反而毫无用处。

,

我发现要求很奇怪,因为我看不到接受§的原理,但没有看到å的含义,并且我没有检查您想要的字符列表接受任何细节。

但是,在我看来,您要问的是接受代码点值小于0x0080的任何字符,奇数球例外为§(0x00A7)。因此,我将其编码为显式进行检查,而不涉及正则表达式。我假设您想排除控制字符,即使它们可以在英文键盘上键入。

伪代码:

 for each character ch in string
      if ch < 0x0020 || (ch >= 0x007f && ch != `§')
           then it's not allowed

尽管您的要求很奇怪,因为您要禁止使用“特殊字符”,但是允许使用“!@#$%6&*()_ +”。您对“特殊字符”的定义是什么?

对于“允许的字符”的任意定义,我将使用位集。

static BitSet valid = new Bitset();
static {
    valid.set('A','Z'+1);
    valid.set('a','z'+1);
    valid.set('0','9'+1);
    valid.set('.');
    valid.set('_');
      ...etc...
}

然后

for (int j=0; j<str.length(); j++)
    if (!valid.get(str.charAt(j))
        ...illegal...