簡體   English   中英

標題的正則表達式匹配

[英]Regular Expression Match for a Title

我需要使用C#為標題編寫正則表達式,這是要求:

  1. 標題為必填項(長度> 0);
  2. 最多256個字符(長度<= 256);
  3. 禁止使用任何字符,但僅空白是非法的(僅包含空白的標題是非法的);
  4. 沒有前導或尾隨空格;

我已經有這個了:

^.{1,256}$

那么我怎樣才能滿足規則3?

編輯:

  1. 更清楚地解釋了規則3;
  2. 我從馬里奧的答案中添加了規則4。

使用(?=pattern)

@"^(?=.*\S).{1,256}$"

(?=pattern)斷言指定的模式在此位置之后立即存在。

因此,正則表達式在且僅當在字符串的開頭之后與模式.*\\S匹配且整個字符串與模式^.{1,256}$匹配時才匹配^.{1,256}$

您需要使用零寬度斷言:

@"^(?=.*\S).{1,256}$"

(?=.*\\S)匹配以非空格字符結尾的任何字符序列,但不影響其余匹配。

我將完全跳過正則表達式,因為您可以通過兩個簡單的步驟對字符串的清理和驗證進行硬編碼:

  • 使用String.Trim(null)刪除所有前導/尾隨空格。
  • 比較剩余字符串的長度。
  • 大寫第一個字符(如果需要)。

這是可行的,因為僅包含空格的名稱將被修剪為0長度。 這也避免了使用諸如" Let's go!"標題" Let's go!"

您可以使用[^ \\ s]匹配除空格以外的任何字符

盡管我自己的答案符合我的問題,但功勞仍然應該歸功於其他人(我要么贊成並選擇正確的答案),因為我在他們的答案之后編輯了我的問題。

=====================

我終於提出了一個純正則表達式解決方案(沒有任何額外的步驟)

^(\S|\S.{0,254}\S)$

(盡管我不明白為什么括號()很重要)

以下測試用例通過:

    [TestMethod]
    public void CheckTitleTest()
    {
        // Empty
        Assert.IsFalse(CheckTitle(@""));

        // A whitespace
        Assert.IsFalse(CheckTitle(@" "));

        // Multiple whitespace only
        // http://msdn.microsoft.com/en-us/library/t809ektx.aspx
        Assert.IsFalse(CheckTitle("  \t \n \u1680"));

        // Leading whitespaces
        Assert.IsFalse(CheckTitle("  \tabc"));

        // Trailing whitespaces
        Assert.IsFalse(CheckTitle("abc\t "));

        // Leading and trailing whitespaces
        Assert.IsFalse(CheckTitle("  \tabc\t "));

        // Too long: 257 character
        Assert.IsFalse(CheckTitle(@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/*"));

        // A normal title
        Assert.IsTrue(CheckTitle(@"This is a normal title"));
        Assert.IsTrue(CheckTitle(@"This is a normal title."));

        // 256 characters
        Assert.IsTrue(CheckTitle(@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"));

        // A very simple title
        Assert.IsTrue(CheckTitle(@"A"));
        Assert.IsTrue(CheckTitle(@"!"));
        Assert.IsTrue(CheckTitle(@"\"));
    }

暫無
暫無

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

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