簡體   English   中英

如何獲取正則表達式來檢查字符串是否只包含字母字符[az]或[AZ]?

[英]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.

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