[英]Regular Expression Match for a Title
我需要使用C#為標題編寫正則表達式,這是要求:
我已經有這個了:
^.{1,256}$
那么我怎樣才能滿足規則3?
編輯:
使用(?=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.