我正在尝试匹配像 '[sometext<someothertext>]' 这样的字符串(即,左方括号、文本、左尖括号、文本、右尖括号、右方括号),在MySQL中的一个列中。最初我使用了以下查询语句(请注意,由于正则表达式查询在MySQL中被转义两次,您必须在通常使用一个反斜杠的地方使用两个反斜杠):
SELECT * FROM message WHERE msgtext REGEXP '\\[(.+)?<(.+)?>\\]'
这个查询没有出现错误,但是返回了一些我不想要的东西。与“(.+)”不同,我想要的是“[^\]]”(匹配除右方括号以外的所有内容)。当我更改了查询时,出现了以下错误:“从regexp得到错误'repetition-operator operand invalid'”。
阅读了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 '\\[([^\\]]+)?<([^\\]]+)?>\\]'