代码之家  ›  专栏  ›  技术社区  ›  Rick

带方括号的mysql regexp

  •  3
  • Rick  · 技术社区  · 16 年前

    我正在尝试在MySQL的列中匹配类似“[someText<someOtherText>]”(即,左方括号、文本、左角括号、文本、右角括号、右方括号)的字符串。最初我使用了以下查询(注意,由于在MySQL中对regex查询进行了两次转义,所以在通常使用一个反斜杠的情况下,必须使用两个反斜杠):

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

    这个查询没有收到错误,但它返回了我不想要的东西。我要的不是(.+),而是[^\](匹配除右方括号外的所有内容)。更改查询时,出现以下错误:“get error”repetition operator operand invalid“from 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 '\\[([^\\]]+)?<([^\\]]+)?>\\]'
    
    2 回复  |  直到 16 年前
        1
  •  6
  •   Quassnoi    16 年前

    这对我很有用:

    SELECT '[sometext<someothertext>]' REGEXP '\\[([^[.right-square-bracket.]]+)?<([^[.right-square-bracket.]]+)?>\\]$';
    
        2
  •  0
  •   steamer25    16 年前

    最后一个regex看起来是正确的,一旦斜线被取消,它就可以在firefox/js中工作。但看起来MySQL不支持本机捕获组…也许这就是问题所在。

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

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

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