【问题标题】:Passing parameters to SQL regular expressions将参数传递给 SQL 正则表达式
【发布时间】:2014-01-10 07:17:14
【问题描述】:

我想知道是否可以将参数传递给正则表达式,就好像它们是 MySQL REGEXP 函数中的文字字符串一样。我想做的是:

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

现在,当我将一个点(“.”)传递给第二个参数时,它会自动匹配任何字符,正如预期的那样。这意味着像“stringastring”和“stringbstring”这样的字符串匹配模式。我想知道是否可以只匹配文字点,以便在这种情况下只匹配“string.string”。有没有办法用 MySQL 正则表达式做这样的事情,不涉及显式转义参数(这首先违背了传递参数的目的)?

【问题讨论】:

    标签: mysql sql regex


    【解决方案1】:

    尝试使用括号,如:

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

    请看这里:http://sqlfiddle.com/#!2/a3059/1

    【讨论】:

    • 坦率地说,这并不能回答问题。 hack 也不适用,因为我不知道要传递的参数的长度。
    • 我认为您不能在不明确转义特殊字符的情况下使用正则表达式。请参阅我放置的链接。
    【解决方案2】:

    如果我正确理解您的问题,我认为您正在寻找这个:

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

    使用 REPLACE 函数,任何点总是转义为 [.],但所有其他特殊字符都按字面意思传递。

    【讨论】:

    • 不,我打算将参数传递给正则表达式,以便将它们作为文字进行解释。如果那个点是一个 ^ 或一系列字符.. 像你建议的那样的黑客不适用。
    • @user2180613 但为什么需要正则表达式而不仅仅是 LIKE 或 = ?
    • 因为用例需要正则表达式?这也是一个相当复杂的问题。
    • @user2180613 好的,所以这两个字符串是两个正则表达式,只是必须从字面上匹配的参数?
    【解决方案3】:

    对于那些使用 PHP 并寻找与此相关的答案的人,我在 stackover here 中找到了与此相关的答案,尽管不是直接针对 MySQL 查询。这个想法是使用 preg_quote() 来转义正则表达式元字符。但在您的情况下,您必须将它两次应用于您的参数。

    $param = preg_quote(preg_quote($param))

    然后

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

    阅读此article 和 cmets 了解更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 2021-12-31
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多