带有方括号的mySQL Regexp

时间:2009-06-05 16:36:35

标签: mysql regex square-bracket

我正在尝试匹配mySQL中列中的'[sometext< someothertext>]'(即左方括号,文本,左尖括号,文本,右尖括号,右方括号)等字符串。最初我使用了以下查询(注意,因为正则表达式查询在mySQL中被转义两次,所以你必须使用两个反斜杠,你通常会使用一个反斜杠):

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

此查询没有收到任何错误,但它返回了我不想要的内容。而不是(。+),我想要[^ \]](匹配除了右方括号之外的所有内容)。当我更改查询时,我收到以下错误:“从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 个答案:

答案 0 :(得分:6)

这对我有用:

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

答案 1 :(得分:0)

你的最终正则表达式看起来是正确的,并且在斜杠未转义后可以在Firefox / JS中使用。看起来MySQL本身并不支持捕获组......可能这就是问题所在。

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

另外,你可以试试*而不是+?对于你否定的正方形。

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