如果驗證總是在服務器上完成(這就是runat="server"
手段,是不是?),最簡單的解決辦法可能是使用這個表達式:
(?s)^.*Content.*$
(?s)
打開Singleline
模式,該模式允許.
元字符匹配所有字符,包括換行符。如果你想讓它在客戶機上運行良好,使用此:
^[\s\S]*Content[\s\S]*$
這是因爲JavaScript有沒有類似Singleline
模式(也稱爲DOT_ALL
,DOTALL
,點百搭,單行或/s
模式)。它不識別內聯修飾符,如(?s)
和(?i)
。
小心諸如(.\s*)*
這樣的結構,其中帶量詞的表達式(*
,+
等)包含在本身由量詞控制的組中。如果正則表達式無法立即實現匹配,它會返回並嘗試通過不同的路徑進行匹配(即,通過使用正則表達式的不同部分來匹配字符串的不同部分),這會在性能方面變得非常昂貴。這個正則表達式特別糟糕,因爲.
和\s
可以匹配許多相同的字符,這大大增加了在放棄之前必須探索的路徑數量。
這種現象通常被稱爲catastrophic backtracking,它通常表現在無法匹配的情況下。當期望序列Content
存在時,我希望驗證程序能正常工作。
順便說一句,如果你想匹配只能在完整的單詞Content
,你應該添加單詞邊界,就像這樣:
(?s)^.*\bContent\b.*$
這將防止像MalContent
和Contentious
話誤報。 \b
在不同的正則表達式中有不同的作用。在.NET中,除非指定了ECMAScript
模式,否則它是可識別Unicode的。在JavaScript中,它應該只識別ASCII字母和數字作爲單詞字符;在大多數瀏覽器中都是這樣,但不要認爲它是理所當然的。
真棒的答案。我使用[\ s \ S]選項,因爲我希望它在客戶端運行(runat =「server」表示服務器必須解釋標記,EnableClientScript =「false」只會在服務器上運行) 。 – Eric 2010-12-03 16:18:32