[英]How can I get a regex to check that a string only contains alpha characters [a-z] or [A-Z]?
我正在嘗試創建一個正則表達式來驗證給定的字符串只有字母az或AZ。 該字符串最長可達25個字母。 (我不確定正則表達式是否可以檢查字符串的長度)
例子:
1. "abcdef" = true;
2. "a2bdef" = false
;
3. "333" = false;
4. "j" = true;
5. "aaaaaaaaaaaaaaaaaaaaaaaaaa" = false;
// 26封信
以下是我到目前為止的情況......雖然無法弄清楚它有什么問題
Regex alphaPattern = new Regex("[^az]|[^AZ]");
我認為這意味着字符串只能包含來自az的大寫或小寫字母,但是當我將它與所有字母的字符串匹配時,它返回false ...
此外,任何有關使用正則表達式與其他驗證方法的效率的建議將非常感激。
Regex lettersOnly = new Regex("^[a-zA-Z]{1,25}$");
^
表示“在字符串開頭處開始匹配” [a-zA-Z]
表示“匹配小寫字母和大寫字母az” {1,25}
表示“匹配前一項(字符類,見上文)1至25次” $
表示“僅匹配光標位於字符串末尾” 我正在嘗試創建一個正則表達式來驗證給定的字符串只有字母az或AZ。
很容易完成,因為許多其他人已經指出使用所謂的“字符類”。 從本質上講,這些允許我們指定一系列值來用於匹配:(注意:為了簡化,我假設隱含^和$ anchors,這將在本文后面解釋)
[az]匹配任何單個小寫字母。
例如:匹配,8不匹配
[AZ]匹配任何單個大寫字母。
例如:匹配,a不匹配
[0-9]匹配任何單個數字零到九
例如:8場比賽,a不匹配
[aeiou]僅在a或e或i或o或u上匹配。 例如:匹配,z不匹配
[a-zA-Z]匹配任何單個小寫或大寫字母。 例如:匹配,匹配,3不匹配
當然,這些也可以被否定: [^ az]匹配任何不是小寫字母ex的東西:5個匹配,A個匹配,a匹配不匹配
[^ AZ]匹配任何不是大寫字母ex:5匹配,A不匹配,匹配
[^ 0-9]匹配任何不是數字的東西:5不匹配,A匹配,匹配
[^ Aa69]匹配任何東西,只要它不是A或a或6或9 ex:5匹配,A不匹配,a不匹配,3匹配
要查看一些常見的字符類,請訪問: http : //www.regular-expressions.info/reference.html
該字符串最長可達25個字母。 (我不確定正則表達式是否可以檢查字符串的長度)
你絕對可以檢查“長度”但不是你想象的方式。 我們使用{}嚴格測量重復,而不是長度:
a {2}將兩個a匹配在一起。
例如:a不匹配,aa匹配,aca不匹配
4 {3}將三個4匹配在一起。 例如:4不匹配,44不匹配,444匹配,4434不匹配
重復具有我們可以設置為具有下限和上限的值:
a {2,}匹配兩個或多個a。 ex:a不匹配,aa匹配,aaa匹配,aba不匹配,aaaaaaaaa匹配
{2,5}匹配兩到五個a。 ex:a不匹配,aa匹配,aaa匹配,aba不匹配,aaaaaaaaa不匹配
重復擴展到字符類,因此: [az] {5}將任意五個小寫字符匹配在一起。 ex:bubba匹配,Bubba不匹配,BUBBA不匹配,asdjo匹配
[AZ] {2,5}將兩到五個大寫字符匹配在一起。 ex:bubba不匹配,Bubba不匹配,BUBBA比賽,BUBBETTE不匹配
[0-9] {4,8}將四到八個數字匹配在一起。 例如:bubba不匹配,15835匹配,44不匹配,3456876353456不匹配
[a3g] {2}如果它們一起出現兩次,則匹配一個OR 3 OR g。 例如:aa匹配,ba不匹配,33匹配,38不匹配,a3不匹配
現在讓我們來看看你的正則表達式: [^ az] | [^ AZ]翻譯:匹配任何東西,只要它不是小寫字母或大寫字母。
要修復它以滿足您的需求,我們會像這樣重寫它:第1步:刪除否定[az] | [AZ]翻譯:找到任何小寫字母或大寫字母。
第2步:雖然不是非常需要,但是讓我們稍微清理OR邏輯[a-zA-Z]翻譯:找到任何小寫字母或大寫字母。 與上面相同,但現在只使用一組[]。
第3步:現在讓我們指出“長度” [a-zA-Z] {1,25}翻譯:找到任何小寫字母或大寫字母重復一到二十五次。
這是事情變得時髦的地方。 你可能認為你在這里完成了,你很可能依賴於你正在使用的技術。
嚴格地說正則表達式[A-ZA-Z] {1,25}將ANYWHERE匹配線之一25上或小寫字母:
[a-zA-Z] {1,25} a匹配,aZgD匹配,BUBBA匹配,243242hello242552 MATCHES
事實上,到目前為止我給出的每個例子都會做同樣的事情。 如果這就是你想要的,那么你的狀態很好,但根據你的問題,我猜你只需要整行上一到二十五個大寫或小寫字母。 為此我們轉向錨點。 錨點允許我們指定那些討厭的細節:
^行的開頭
(我知道,我們剛才用這個來否定,不要讓我開始)
$ end of a line
我們可以像這樣使用它們:
^ a {3}從一行開始匹配三次ex:aaa匹配,123aaa不匹配,aaa123匹配
a {3} $在一行結束時匹配三次:aaa匹配,123aaa匹配,aaa123不匹配
^ A {3} $ 整條生產線的前三次的搭配在一起:AAA比賽,123aaa不匹配,AAA123不匹配
請注意,aaa在所有情況下都匹配,因為從技術上講,它在行的開頭和結尾有三個a。
因此,最終的,技術上正確的解決方案是,在一條線上找到“最多五個字符長”的“單詞”將是:
^ [A-ZA-Z] {1,25} $
時髦的部分是,有些技術隱含地為你設置了正則表達式,有些技術沒有。 您只需要測試正則表達式或閱讀文檔以查看是否有隱式錨點。
/// <summary>
/// Checks if string contains only letters a-z and A-Z and should not be more than 25 characters in length
/// </summary>
/// <param name="value">String to be matched</param>
/// <returns>True if matches, false otherwise</returns>
public static bool IsValidString(string value)
{
string pattern = @"^[a-zA-Z]{1,25}$";
return Regex.IsMatch(value, pattern);
}
該字符串最長可達25個字母。 (我不確定正則表達式是否可以檢查字符串的長度)
正則表達式可以檢查字符串的長度 - 從其他人發布的答案中可以看出。
但是,當您驗證用戶輸入(例如,用戶名)時,我會建議單獨執行該檢查。
問題是,正則表達式只能告訴你字符串是否與之匹配。 它不會告訴它為什么不匹配。 文本太長還是包含不允許的字符 - 你無法分辨。 當一個程序說:“提供的用戶名包含無效字符或太長”時,它遠非友好。 相反,您應該為不同的情況提供單獨的錯誤消息。
您正在使用的正則表達式是[^az]
和[^AZ]
的交替。 表達式[^…]
意味着匹配除字符集中描述的字符之外的任何字符。
總的來說,表達式意味着匹配除az
之外的任何單個字符或AZ
之外的任何單個字符。
但您需要一個僅與a-zA-Z
匹配的正則表達式:
[a-zA-Z]
並指定其長度,使用字符串的開始( ^
)和結束( $
)錨定表達式,並使用{
n
,
m
}
量詞描述長度,表示至少n
但不超過m
次重復:
^[a-zA-Z]{0,25}$
難道我理解正確的話,它只能包含大寫 或小寫字母?
new Regex("^([a-z]{1,25}|[A-Z]{1,25})$")
對於這種情況,正則表達式似乎是正確的用法。
順便說一下,字符類中第一個位置的插入符號(“^”)表示“不”,所以你的“ [^az]|[^AZ]
”意思是“不是任何小寫字母,或者不是任何大寫字母“(不管az不是所有字母)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.