2013-12-21 162 views
1

我想知道是否可以將參數傳遞給正則表達式,就好像它們是MySQL REGEXP函數中的文字字符串一樣。我想這樣做的是以下幾點:(「」)將參數傳遞給SQL正則表達式

SELECT ? REGEXP CONCAT('string', ?, 'string') 

現在,當我通過一個點到第二個參數,它會自動匹配任何字符,符合市場預期。這意味着像「stringastring」和「stringbstring」這樣的字符串匹配模式。我想知道是否可以只匹配字面點,以便在這種情況下只匹配「string.string」。有沒有辦法用MySQL正則表達式來做這樣的事情,而不涉及明確地轉義參數(這首先破壞了傳遞參數的目的)?

回答

0

嘗試把括號,如:

SELECT ? REGEXP CONCAT('string', '[.]', 'string') 

在這裏看到:http://sqlfiddle.com/#!2/a3059/1

+0

坦率地說,這並不回答這個問題。黑客也不適用,因爲我不知道我要通過的參數的長度。 – user2180613

+0

我不認爲你可以使用正則表達式而不明確地逃避特殊字符。看到我放的鏈接。 – JamesJ

0

如果我正確理解你的問題,我認爲你正在尋找這樣的:使用替換

SELECT ? REGEXP CONCAT('string', REPLACE(?, '.', '[.]'), 'string') 

函數,任何點總是轉義爲[。],但所有其他特殊字符都是字面傳遞。

+0

不,我打算將參數傳遞給正則表達式,以便將它們作爲文字插入。如果這個點是一個^或一系列字符的話,那麼像你所建議的那樣的黑客就不適用了。 – user2180613

+0

@ user2180613但爲什麼你需要一個正則表達式,而不僅僅是一個LIKE或= =? – fthiella

+0

那麼因爲用例需要正則表達式?這也是一個相當複雜的問題。 – user2180613

0

對於那些正在使用PHP並尋找與此相關的答案的人,我在堆棧here中發現了一個與此相關的答案,但不是直接針對MySQL查詢。這個想法是使用preg_quote()來轉義正則表達式元字符。但在你的情況下,你必須將它應用兩次到你的參數。

$param = preg_quote(preg_quote($param))

然後

SELECT ? REGEXP CONCAT('string', $param, 'string')

閱讀本article和意見,以瞭解更多

相關問題