关于正则表达式:带有方括号的mySQL Regexp

mySQL Regexp with square brackets

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

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

这个查询没有收到错误,但它返回了我不想要的东西。我要的不是(.+),而是[^](匹配除右方括号外的所有内容)。更改查询时,出现以下错误:"get error"repetition operator operand invalid"from regexp"

在阅读完mysql文档后,它声明"要包含一个文本]字符,它必须紧跟在左括号["后面,因为我想要"^]"而不是"]",这是不是可能的,因为括号不能是左括号之后的第一个字符?下面是我尝试过的一些查询,它们得到上面列出的相同错误:

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

更新:

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

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


这对我很有用:

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

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

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

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

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