簡體   English   中英

Java 檢查字符串是否只包含英文鍵盤字母

[英]Java check if string only contains english keyboard letters

我想禁止用戶在他們的名字中使用任何特殊字符。 他們應該能夠使用整個英文鍵盤,所以

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

等等。 所以他們應該被允許使用你可以用鍵盤輸入的每一個“正常”的英文字符。

我該如何檢查?

使用正則表達式將名稱與英文字母匹配。

解決方案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

我們可以這樣做:

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

您可以為此使用正則表達式

由於您在正則表達式中有許多具有特殊含義的字符,因此我建議將它們放在單獨的字符串中並引用它們:

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

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

至於如何首先獲取特殊字符的字符串,目前還沒有辦法列出用戶當前的鍵盤布局可以輸入的所有字符。 事實上,因為有辦法輸入任何 Unicode 字符,所以這樣的列表無論如何都是無用的。

我覺得這個要求很奇怪,因為我看不出接受§但不接受å背后的理由,而且我沒有詳細檢查你想要接受的字符列表。

但是,在我看來,你要問的是接受任何代碼點值小於 0x0080 的字符,除了§ (0x00A7) 的奇怪例外。 所以我會對其進行編碼以明確地進行檢查,而不是涉及正則表達式。 我假設您想排除控制字符,即使它們可以在英文鍵盤上輸入。

偽代碼:

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

不過,您的要求很奇怪,因為您想禁止“特殊字符”但允許 `.@#$%6&*()_+' 例如? 你對“特殊字符”的定義是什么?

對於“允許字符”的任意定義,我會使用 bitset。

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...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM