【问题标题】:mySQL Regexp with square brackets带方括号的 mySQL 正则表达式
【发布时间】:2009-06-05 16:36:35
【问题描述】:

我正在尝试在 mySQL 的列中匹配字符串,例如 '[sometext]'(即左方括号、文本、左尖括号、文本、右尖括号、右方括号)。最初我使用了以下查询(请注意,由于正则表达式查询在 mySQL 中被转义了两次,因此您必须在通常使用一个反斜杠的地方使用两个反斜杠):

SELECT * FROM message WHERE msgtext REGEXP '\\[(.+)?<(.+)?>\\]'

这个查询没有收到任何错误,但它返回了我不想要的东西。而不是 (.+),我想要 [^\]] (匹配除右方括号之外的所有内容)。当我更改查询时,出现以下错误:“从正则表达式中获取错误'重复运算符操作数无效'”

阅读 mySQL 文档here 后,它声明“要包含文字 ] 字符,它必须紧跟左括号 [。”由于我想要“^\]”而不是“]”,这是否可能,因为括号不能是左括号之后的第一个字符?以下是我尝试过的一些查询,它们得到了上面列出的相同错误:

SELECT * FROM message WHERE msgtext REGEXP '\\[([^\\]]+?)<([^\\]]+?)>\\]'
SELECT * FROM message WHERE msgtext REGEXP '\\[[^\\]]+?<[^\\]]+?>\\]'
SELECT * FROM message WHERE msgtext REGEXP '\\[[^[.right-square-bracket.]]]+?<[^[.right-square-bracket.]]]+?>\\]'

更新:

以下查询运行没有错误,但不返回任何行,即使我知道有些列与我要查找的内容相匹配(基于顶部的原始查询):

SELECT * FROM message WHERE msgtext REGEXP '\\[([^\\]]+)?<([^\\]]+)?>\\]'

【问题讨论】:

    标签: mysql regex square-bracket


    【解决方案1】:

    这对我有用:

    SELECT '[sometext<someothertext>]' REGEXP '\\[([^[.right-square-bracket.]]+)?<([^[.right-square-bracket.]]+)?>\\]$';
    

    【讨论】:

      【解决方案2】:

      你的最终正则表达式看起来是正确的,并且一旦斜杠被取消转义,它就可以在 Firefox/JS 中工作。看起来 MySQL 本身并不支持捕获组……也许这就是问题所在。

      也许这会有用:http://mysqludf.com/lib_mysqludf_preg/

      另外,您可以尝试使用 * 而不是 +?为你否定的右方格。

      * 表示 0 次或多次重复(贪心)
      +?表示1次或多次重复(懒惰)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多