括號匹配、自定義字符匹配、大括號匹配、花括號匹配、方括號匹配、自定義配對符、語法檢測、代碼解析、腳本解析、公式解析、Json解碼、xml解碼

在項目中經常會遇到題目中的需求,例如:公式解析、Json解碼、xml解碼、html代碼處理、代碼檢查、腳本解析。等等等等等等等等。幾乎所有的領域都對《成對字符的匹配》有需要。


下面把自己積累的代碼整理一下,給有用的人做個參考:


下載地址

https://download.csdn.net/download/sqlstar/10282069
************************************************************************************************************************

效果圖:


********分隔符********

********分隔符********


********分隔符********


********分隔符********


********分隔符********


********分隔符********


********分隔符********

下載地址

https://download.csdn.net/download/sqlstar/10282069


************************************************************************************************************************
算法分析:
括號匹配,主要是算法是:在查找「右側字符」的時候,留意「左側字符」。用一個計數器,在找到「右側字符」之前,每發現一個「左側字符」這個計數器加一,每發現一個「右側字符」這個計數器減一,計數器爲零的時候,即爲找到了「右側字符」。




************************************************************************************************************************


僞代碼:
/// <summary>
/// 找到配對的座標,匹配不上的時候t_右括號索引-1
/// </summary>
/// <param name="輸入字符串">目標字符串</param>
/// <param name="左括號">「開始標記」</param>
/// <param name="右括號">「結束標記」</param>
/// <param name="開始位置">「起始索引」:應該是「開始標記」的右側位置</param>
/// <param name="最大匹配長度">在指定的範圍內檢索</param>
/// <param name="左括號與右括號的個數差">「開始標記」多出「結束標記」的數量(爲0即說明完整匹配),入口永遠傳0</param>
/// <返回s></返回s>
public int GetSpouse(string 輸入字符串
                            , string 左括號
                            , string 右括號
                            , int 開始位置
                            , int 最大匹配長度
                            , ref int 左括號與右括號的個數差)
{
    如果 (右括號 等於 "")
    {//如果【結束符】是空,那麼直接t_右括號索引最後的位置
        返回 輸入字符串.長度 - 1;
    }
    如果 (左括號 等於 "")
    {//如果【開始符】是空,那麼直接t_右括號索引【結束符】的位置
        返回 輸入字符串.檢索子串(右括號, 開始位置);
    }


    //起步就是1個


    左括號與右括號的個數差 = 1;


    int t_左括號索引 = 0;
    int t_右括號索引 = 0;


    for (; 開始位置 小於 最大匹配長度; )
    {
        t_右括號索引 = 輸入字符串.檢索子串(右括號, 開始位置);
        t_左括號索引 = 輸入字符串.檢索子串(左括號, 開始位置);
        如果 (t_右括號索引 等於 -1)
        {
            返回負一;
        }
        否則
        {
            如果 (t_左括號索引 大於 負一)
            {
                如果 (t_右括號索引 <= t_左括號索引)//對於【開始符】和【結束符】一樣的時候【結束符】優先
                {
                    左括號與右括號的個數差--;
                    開始位置 = t_右括號索引 + 右括號.長度;
                }
                否則
                {
                    左括號與右括號的個數差++;
                    開始位置 = t_左括號索引 + 左括號.長度;
                }
            }
            否則
            {
                {
                    左括號與右括號的個數差--;
                    開始位置 = t_右括號索引 + 右括號.長度;
                }
            }
        }
        如果 (左括號與右括號的個數差 等於 零)
        {
            返回 t_右括號索引;
        }
    }
    返回 負一;
}


************************************************************************************************************************



下載地址

https://download.csdn.net/download/sqlstar/10282069

下載地址

https://download.csdn.net/download/sqlstar/10282069

下載地址

https://download.csdn.net/download/sqlstar/10282069