3

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

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

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

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

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 '\\[([^\\]]+)?<([^\\]]+)?>\\]'
4

2 回答 2

6

这对我有用:

SELECT '[sometext<someothertext>]' REGEXP '\\[([^[.right-square-bracket.]]+)?<([^[.right-square-bracket.]]+)?>\\]$';
于 2009-06-05T17:37:32.890 回答
0

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

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

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

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

于 2009-06-05T17:25:32.907 回答