2013-12-21 122 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和意见,以了解更多

相关问题