2015-06-16 108 views
3

不知道它實際上是可能的,但考慮到以下文字:動態正則表達式來捕捉

INSERT INTO cms_download_history 
SET 
user_id  = '{$userId}', 
download_id  = '{$fileId}', 
remote_addr  = '{$remote_addr}', 
doa = GetDate()"; 

我想改變這種狀況是:

INSERT INTO cms_download_history 
(user_id,download_id,remote_addr,doa) 
VALUES('{$userId}','{$fileId}','{$remote_addr}',GetDate()); 

做一個正則表達式查找和替換這一個很容易,因爲我知道我有多少列,但如果我正在嘗試在不知道列數的情況下爲多個類似查詢做到這一點,即:

INSERT INTO mystery_table 
SET 
col1 = val1 
col2 = val2 
.... unknown number of columns and values. 

是否有一個動態正則表達式,我可以編寫,將檢測該示例?

+0

如果我正確地理解了你的問題,你可以簡單地通過(逗號和)換行來分割字符串,作爲第一步。 – Xufox

+0

@Xufox我沒有關注... –

+0

您可以將文本分割成單獨的行並單獨計算,分析和更改它們,而不是將RegEx應用於整個文本。至少,這會更容易。 – Xufox

回答

1

其實,如果所有查詢這個樣子,只有列的變量數量,你可以使用一個有點簡單的正則表達式得到的字段名稱:

(\w+)\W*=\W*['"].+?(?!\\)['"], 

Here is an example。這裏是做什麼的:

  • 它抓住了一個或多個單詞字符,如果依次爲:
    • 零個或多個空白字符
    • 等號
    • 零個或多個空白字符(再次)
    • 串的'"(開始)
    • 一個或多個字符
    • 未轉義'"
    • 逗號

請注意,這並不認爲所有的值都是字符串。如果您還需要支持號碼,請告訴我。

+1

這實際上是完美的謝謝。並將其調整爲INSERT([^ S] | S [^ E] | SE [^ T])* SET \ n?((\ w +)\ W * = \ W * ['「]。+?( ?!\\)['「],\ n)*'會幫助我只捕捉這些具有」insert..set「的行 –