檢查字符串是否包含非字母數字字符
1. 概述
在本教程中,我們將學習如何檢查字符串是否包含非字母數字字符。此功能在各種場景中都至關重要,例如查找密碼的強度、拒絕在應用程序中輸入的特殊字符等等。當我們想要將其使用限制為語言腳本時,這個要求變得更加有趣,我們也嘗試在這裡解決這個問題。
2. 使用正則表達式
我們認為使用正則表達式是實現這一要求的最靈活的方式。讓我們考慮一個簡單的用例,其中應用程序必須僅接受英文數字和字母字符。為了實現這一點,我們使用正則表達式[^a-zA-Z0-9]
來識別非字母數字字符:
public class NonAlphaNumRegexChecker {
private static final Pattern PATTERN_NON_ALPHNUM_USASCII = Pattern.compile("[^a-zA-Z0-9]+");
public static boolean isAlphanumeric(String str) {
Matcher matcher = PATTERN_NON_ALPHNUM_USASCII.matcher(str);
return matcher.find();
}
}
但如果應用程序想要接受其他語言的字母,那麼我們必須調整正則表達式,使其也涵蓋 Unicode 字母字符和數字。有關更多詳細信息,請查看 Javadocs 中的“Unicode 支持”部分。在這裡,我們使用正則表達式二進制屬性類IsAlphabetic
和IsDigit:
public class NonAlphaNumRegexChecker {
private static final Pattern PATTERN_NON_ALPHNUM_ANYLANG = Pattern.compile("[^\\p{IsAlphabetic}\\p{IsDigit}]");
public static boolean containsNonAlphanumeric(String input) {
Matcher matcher = PATTERN_NON_ALPHNUM_ANYLANG.matcher(input);
return matcher.find();
}
}
讓我們考慮另一個用例,其中應用程序僅接受特定Unicode 腳本(例如西里爾文、格魯吉亞文或希臘文)中的字符。為了實現這種情況,正則表達式支持 Unicode 腳本類,例如IsCyrillic
、 IsGreek
、 IsGeorgian
等。讓我們看一個例子:
public class NonAlphaNumRegexChecker {
public static boolean containsNonAlphanumeric(String input, String script) {
String regexScriptClass = "\\p{" + "Is" + script + "}";
Pattern pattern = Pattern.compile("[^" + regexScriptClass + "\\p{IsDigit}]"); //Binary properties
Matcher matcher = pattern.matcher(input);
return matcher.find();
}
}
由於上述方法以語言腳本作為參數,因此每次都必須編譯模式。這可能是性能瓶頸,因此,我們可以在映射中緩存枚舉Character.UnicodeScript
中提到的所有腳本的已編譯Pattern
對象,並使用關鍵script
檢索它。
3. 使用字符Character
的isLetterOrDigit() M
方法
現在,讓我們看一下Character
類,它可以幫助實現上一節中討論的所有用例。第一個解決方案使用isLetterOrDigit()
方法檢查以任何語言編寫的字符串中的非字母數字字符:
public class NonAlphaNumericChecker {
public static boolean isNonAlphanumericAnyLangScript(String str) {
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!Character.isLetterOrDigit(c)) {
return true;
}
}
return false;
}
}
但是,如果我們只想允許特定的語言腳本,那麼我們必須對其進行一些調整。在這裡,當一個字符既不是該語言中的字母也不是數字時,我們將其視為非字母數字:
public class NonAlphaNumericChecker {
public static boolean isNonAlphanumericInLangScript(String str, String script) {
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!Character.UnicodeScript.of(c).toString().equalsIgnoreCase(script)
&& !Character.isDigit(c)) {
return true;
}
}
return false;
}
}
4. 使用 Apache Commons Lang 庫中的StringUtils
類
這是迄今為止使用的所有技術中最不靈活的。 StringUtils
中的isAlphanumeric()
方法支持所有 Unicode 字母或數字,但不支持識別字符串中使用的語言腳本。讓我們看看它的實際效果:
public static boolean isNonAlphanumericAnyLangScriptV2(String str) {
return !StringUtils.isAlphanumeric(str);
}
5. 結論
在本教程中,我們討論了一些必須檢查字符串中是否存在非字母數字字符的用例。我們得出的結論是,正則表達式技術是所有可用選項中最靈活的。此處使用的代碼片段以及相關的 JUnit 測試用例可在 GitHub 上獲取。