題目描述
正規表示式幫助我們在一個字串中搜尋相符的樣本。在這個題目中,您將會得到一個帳號,您的任務是要檢查這個帳號是否有效。一個有效的帳號必須符合以下特性:
可包含英文或數字的字元以及底線「_」字元。
必須要以英文字元為開頭。
字元長度在8到30之間(包含8和30)。
必須要以英文字元為開頭。
字元長度在8到30之間(包含8和30)。
原題網址
輸入格式
第一行包含一個整數N,為測試資料的數量,範圍在1到50之間(包含1和50)。接下來的N行,每行包含了一個字串,表示為帳號,輸入的字串由任意可印出的字元組成。
輸出格式
檢查每個測試資料的帳號是否合法,如果是,輸出「Valid」,否則輸出「Invalid」。
範例輸入
4
alpha_naheed
xahidbuffon
nagib@007
123Swakkhar
alpha_naheed
xahidbuffon
nagib@007
123Swakkhar
範例輸出
Valid
Valid
Invalid
Invalid
Valid
Invalid
Invalid
額外解釋
前兩個測試資料完全符合合法帳號的特性。第三個測試資料是不合法的,因為它包含了一個不合法字元「@」。第四個測試資料也是不合法的,因為它是以數字字元作為開頭。
解題概念
由於帳號的開頭只能是英文字元,因此開頭可以寫成如下的正規表示式:
"\\A[a-zA-Z]"
「\A」為字串的開頭。
接下來的字元可以是英文、數字或是底線字元,剛好是「\w」(word character, [a-zA-Z_0-9])的範圍。字串的字元長度必須要在8到30之間,扣掉開頭的一個英文字元,還需要7到29個「\w」字元。
所以最後可以寫成如下的正規表示式:
\\A[a-zA-Z](\\w){7,29}\\z
「\z」為字串的結尾。
參考答案
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Solution {
public static void main(final String[] args) {
final Scanner in = new Scanner(System.in);
int testCases = Integer.parseInt(in.nextLine());
while (testCases > 0) {
final String username = in.nextLine();
final String pattern = "\\A[a-zA-Z](\\w){7,29}\\z";
final Pattern r = Pattern.compile(pattern);
final Matcher m = r.matcher(username);
if (m.find()) {
System.out.println("Valid");
} else {
System.out.println("Invalid");
}
--testCases;
}
}
}