我想驗證腳本引擎的一些C#源代碼。我想確保只有System.Math類成員可能被引用。我正在嘗試創建一個正則表達式,該正則表達式將匹配一個點,後跟一個大寫字母,後跟任意數量的單詞字符,以不以System.Math開頭的單詞邊界結束。正則表達式頭痛
我開始用這樣的:
(?<!Math)\.[A-Z]+[\w]*
工作正常進行:
return Math.Max(466.89/83.449 * 5.5); // won’t flag this
return Xath.Max(466.89/83.449 * 5.5); // will flag this
它正確地匹配。最大時,它不是由數學之前。但是,現在我試圖擴展正則表達式來包含System,我無法使其正常工作。
我已經試過正則表達式的這些排列多:
((?<!System\.Math)\.[A-Z]+[\w]*)
((?<!(?<!System)\.Math)\.[A-Z]+[\w]*)
((?<!System)\.(?<!Math)\.[A-Z]+[\w]*)
((?<!System)|(?<!Math)\.[A-Z]+[\w]*)
((?<!System\.Math)|(?<!Math)\.[A-Z]+[\w]*)
使用這些語句:
return System.Math.Max(466.89/83.449 * 5.5);
return System.Xath.Max(466.89/83.449 * 5.5);
return Xystem.Math.Max(466.89/83.449 * 5.5);
我已經試過了我能想到的一切,但它要麼始終匹配第二個元素(上面的.Math或.Xath)或它不匹配任何。
如果有人會憐憫我,並指出我做錯了什麼,我會大大appit它。
由於提前, 韋爾頓
我以爲肯定我有一個解決方案,但現在我重新發現了所有列出的表達式,並破壞了我的大腦。確實非常棘手! – 2010-08-13 00:35:53
'Math.'會獨自出現,還是總是以'System.'開頭? – 2010-08-13 00:36:17
您是否考慮過使用編譯器(CSharpCodeProvider),然後使用CodeDom對象圖來掃描除System.Math之外的其他引用?這將是防彈,更可讀,更靈活。 – 2010-08-13 00:39:10