问题描述
我要禁止用户在名称中使用任何特殊字符。 他们应该能够使用整个英文键盘,所以
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...