匹配字符串,正則表達式用了就高大上了?

前言:作者舉了一個例子來表名在實際開發中,做字符串檢測時,會使用正則表達式;但是有些時候壓根沒必要,而導致這樣的原因其實是開發者的基礎不夠紮實。看似很牛地使用了正則表達式解決了問題,而實際上存在更簡單的方法。因此,程序員的紮實的程序語言基礎其實十分重要,而當前恰恰是很多新人盲目學學框架,卻忘記打基礎,結果導致實際開發過程中的代碼一塌糊塗。

Nohemi有個程序需要使用基於角色的安全訪問認證,基於他們組織的需要,他們的角色名稱規則有點不尋常。有些角色名稱是需要大小寫匹配的,而有些角色名稱有更靈活格式。然後她的同事編寫了如下代碼根據角色名稱解析對應的系統角色的。

    public static String decodeRole(String role) {
        String decodedRole = "";
        if (role != null && !role.trim().equals("")) {
            if (role.trim().equalsIgnoreCase(ROLE_1_STRING))
                decodedRole = CODE_ROLE_1;
            else if (role.trim().equalsIgnoreCase(ROLE_2_STRING))
                decodedRole = CODE_ROLE_2;
            else if (role.trim().equalsIgnoreCase(ROLE_3_STRING))
                decodedRole = CODE_ROLE_3;
            else if (personalContains(role.trim(), ROLE_4_STRING))
                decodedRole = CODE_ROLE_4;
        }
        return decodedRole;
    }

這是角色名稱轉換爲系統角色的關鍵方法。角色1、2和3必須準確匹配。而角色4,需要通過特殊規則匹配 — 一個需要通過正則表達式校驗的複雜規則。

    private static final String REGEXP_SUFFIX = ").*$";
    private static final String REGEXP_PREFIX = "^.*(";
    public static boolean personalContains(String fatherString,
                                           String toSearchString) {
        Pattern p = Pattern.compile(REGEXP_PREFIX + toSearchString.toLowerCase()
                + REGEXP_SUFFIX);
        Matcher m = p.matcher(fatherString.toLowerCase());
        boolean matchFound = m.matches();
        if (matchFound)
            return true;
        else
            return false;
    }

這段代碼的規則是這樣的,如果你搜索一個字符串,例如ROLE_4,則構建完成的正則表達式爲^.*(ROLE_4).*$。也就是這個字符串的開頭必須是0個或多個字符,然後是ROLE_4字符串,最後是以0個或多個字符結尾。

實際上這是一個是否包含子字符串的的檢測,而這不應該是首選的做法。一方面通過前後拼接、包含變量構建正則表達式代碼看起來十分費解,另一方面Java的String類本身就提供了一個String.contains方法來做這件事情。這個花費力氣寫的personalContains方法根本沒必要。

更扯淡的是,本來這個方法返回的結果只需要是return m.matches()即可,結果他們還增加了一個matchFound變量,簡直就是畫蛇添足!

        if (matchFound)
            return true;
        else
            return false;

wx公號:島上碼農

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章