我正在研究一個簡單的工具來檢查項目上的Java編碼指南。 其中一條準則是驗證沒有像「private static ...」這樣聲明的變量,只允許「private static final ...」。哪個正則表達式查找不包含子字符串的字符串?
我想知道如何得到這個結果。我寫了這一個:
pattern = "private\\\s*static\\\s*(?!final)";
但它不工作。我怎樣才能得到沒有「最終」關鍵字的條目?
感謝, 醫學。
我正在研究一個簡單的工具來檢查項目上的Java編碼指南。 其中一條準則是驗證沒有像「private static ...」這樣聲明的變量,只允許「private static final ...」。哪個正則表達式查找不包含子字符串的字符串?
我想知道如何得到這個結果。我寫了這一個:
pattern = "private\\\s*static\\\s*(?!final)";
但它不工作。我怎樣才能得到沒有「最終」關鍵字的條目?
感謝, 醫學。
這應該工作,是的。您可能希望將第二個空格移到預見範圍內:
pattern = "private\\s*static(?!\\s*final)";
好的謝謝!事實上,當我移動預見範圍內的空間時,它的工作會更好。 – Med 2010-07-26 02:24:42
使用\ s +來要求空間使其開始爲我工作。
private\\s+static\\s+(?!final).+
我還添加了。+以匹配行的其餘部分,這可能並不是您想要的。
我認爲你是以錯誤的方式去解決這個問題的。寫一個半體面的風格檢查器是一項艱鉅的任務,尤其是如果你要應付所有可能的「微不足道的」構造變體(例如不同的修改器命令)和所有可能的脆弱點(例如「點擊」評論和字符串文字)。
海事組織,更好的辦法是使用現有的源代碼檢查和定義自己的風格檢查規則。這是easy to do in PMD。 PMD的優點是它的規則在解析的AST上運行。這使得它們對於語法變體的敏感性要比對源文件使用正則表達式匹配實現的任何東西都要敏感得多。
我同意安德魯的回答(不論這是否是解決這個問題的正確方法)。你肯定應該使用\\s+
而不是\\s*
來檢查是否存在空格,因爲這些空格必須存在。你的正則表達式匹配privatestaticfoobar
,這顯然不是你想要的。
用正則表達式不能準確地做到這一點。編程語言需要解析器,不是正則表達式。這是一個基本定理。
如果有人聲明一個私有的最終靜態變量會怎麼樣? – 2010-07-26 02:25:57
這是一個很好的問題。我會考慮那個......:| – Med 2010-07-26 02:29:51
然後,模式將不會匹配它,因爲'private \\ s * static'不匹配'private final static'。這不是問題,梅德。 – Amber 2010-07-26 02:30:02