2012-08-02 100 views
1

我正在使用C#中的正則表達式來排除字符串中的某些模式。排除正則表達式中的某些模式

這些是我想接受的類型模式:「%00」(十六進制00-FF)和其他沒有開始'%'的字符。我想排除的模式是:「%0」(後面帶有起始%和一個字符的值)和/或字符「'/」。

到目前爲止,我有這個

Regex correctStringRegex = new Regex(@"(%[0-9a-fA-F]{2})|[^%&<>'/]|(^(%.))", 
            RegexOptions.IgnoreCase); 

下面是什麼,我試圖通過和拒絕的例子。

傳遞字符串%02This is%0A%0Da string%03
拒絕字符串%0%0Z%A&<%0a%

如果字符串沒有通過所有我想完全拒絕整個字符串的要求。

任何幫助將不勝感激!

+0

您的意思是「接受」或「除了?」 – 2012-08-02 16:11:37

+0

接受對不起*失敗者錯誤* – Miguel 2012-08-02 16:14:41

回答

1

我的建議是:

^(?:%[0-9a-f]{2}|[^%&<>'/])*$ 

說明:

^    # Start of string 
(?:   # Match either 
%[0-9a-f]{2} # %xx 
|    # or 
[^%&<>'/] # any character except the forbidden ones 
)*   # any number of times 
$    # until end of string. 

這保證了當後面兩個十六進制數%只匹配。由於您已經使用IgnoreCase標誌設置了編譯正則表達式,因此您也不需要a-fA-F

+0

嘿蒂姆,我目前在我的代碼中有這個。 String xyz =「%19%10as%」;並即時做一個布爾x = correctStringRegex.IsMatch(xyz);而且我對這個字符串仍然是真的,我做錯了什麼? – Miguel 2012-08-02 16:33:20

+0

看過這個迴應後,我認爲你需要稍微不同地定義問題。您希望獲取整個字符串的通過/失敗值,只要它不包含任何無效組合。有效組合是%##,其中##以十六進制表示,並且除%(本身)以外的任何字符,&,<, >,'或/。這與匹配模式或將其過濾出來是不同的要求。 – Nevyn 2012-08-02 17:36:06

+0

@Miguel:該字符串用這個正則表達式測試'False'。你真的在使用整個正則表達式(特別是'^'和''''''部分是重要的嗎? – 2012-08-02 18:19:46

1

嗯,考慮到目前爲止的評論,我認爲你需要一個不同的問題定義。你想通過或失敗一個字符串,使用正則表達式,基於字符串是否包含任何無效模式。我假設一個字符串將失敗,如果有任何無效模式,而不是字符串的反轉,如果有任何有效的模式。

因此,我會用這個表達式:%(?![0-9a-f]{2})|[&<>'/]

你會再以這樣的方式運行此一個字符串是無效的,如果你得到一個匹配,有效的字符串不會在這個集合中的任何比賽。

一個相當奇怪的正則表達式的快速解釋。格式(?!)告訴正則表達式「匹配之前的符號,如果這個集合中的符號不​​符合它」即:匹配如果後綴不存在。所以,即時消息告訴它尋找的是%的任何實例,後面跟着2個十六進制字符或任何其他無效字符。假設任何不匹配這個正則表達式的東西都是有效的字符條目。