正則表達式一些場景的應用(含SQL解析)

實際場景1 - WITH臨時表的拆分
因爲公司發展需要,要對sql進行改造拼裝,藉此需要一些比較奇葩的正則表達式來處理。
由於公司採用的是基於Presto的阿里收費平臺ADB,所以一下以ADB語法作爲講解。
假設有一個sql如下:
WITH tmp1 AS ( select xxx ),
tmp2 AS ( select xxxx ),
tmp3 AS ( select xxxx )
SELECT * FROM tmp1
 
我們需要提取到with臨時表部分,然後將其跟 "SELECT * FROM tmp1" 分離開來,這時候方法如下:
public static void main(String[] args) {
    // 正則表達式
    String formatPattern = "(with[\\s\\S]+as?\\s*\\([\\s\\S]+\\))\\s*select";
    // 待匹配字符串
    String sql = "WITH tmp1 AS ( select xxx ), " +
            "tmp2 AS ( select xxxx ), " +
            "tmp3 AS ( select xxxx ) " +
            "SELECT * FROM tmp1";
    Pattern pattern = Pattern.compile(formatPattern);
    Matcher matcher = pattern.matcher(sql.toLowerCase());
    int selectLen = "select".length();
    if (matcher.find()) {
        String withFragment = matcher.group();
        if (!StringUtils.isEmpty(withFragment)) {
            if (withFragment.length() > selectLen) {
                int lastSelectIndex = withFragment.length() - selectLen;
                sql = sql.substring(lastSelectIndex);
                withFragment = withFragment.substring(0, lastSelectIndex);
            }
            System.out.println("WITH部分:" + withFragment);
            System.out.println("其他部分:" + sql);
        }
    }
}
輸出爲:
WITH部分:with tmp1 as ( select xxx ), tmp2 as ( select xxxx ), tmp3 as ( select xxxx )
其他部分:SELECT * FROM tmp1
以上,我們就可以很簡單的把with部分 和 其他部分抽離出來了。

 
實際場景2 - PHP中將MySQL結果轉爲數組格式,格式如下:
將 var[^,]+ 替換爲 => ''
 
 
 

其他語法描述
①分組
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
匹配:IP
關鍵:2[0-4]\d|25[0-5]|[01]?\d\d?
含義:() 括住的 是分組後內容
 
②後向引用
\b(\w+)\b\s+\1\b
匹配:go go
關鍵:\1
含義:每個 括號 括起來的叫一個分組,分組寫法  \1  \2  \3
自定義分組:\b(?<Word>\w+)\b\s*\k<Word>\b     #?<Word>\w+ 定義,\k<Word>捕獲
 
③位置指定(匹配指定位置前後)
\b\w+(?=ing\b)   # 零寬先行斷言
匹配:I'm singing while you're dancing.    
關鍵:(?=ing\b)
 
(?<=\bre)\w+\b   # 零寬後行斷言
匹配:reading a book  
關鍵:(?<=\bre)
 
④負向位置指定
\b\w*q(?!u)\w*\b  # 零寬負向先行斷言
匹配:Iraq fighting  
關鍵:(?!u)
含義:匹配後綴(  u)
 
(?<![a-z])\d{7}   # 零寬負向後行斷言
匹配:_1234567
關鍵:(?<![a-z])
含義:匹配前綴(   a-z)
 
⑤貪婪和懶惰
*?
重複任意次,但儘可能少重複
+?
重複1次或更多次,但儘可能少重複
??
重複0次或1次,但儘可能少重複
{n,m}?
重複n到m次,但儘可能少重複
{n,}?
重複n次以上,但儘可能少重複
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章