mySQL正则表达式中的方括号

3

我正在尝试匹配像 '[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 '\\[([^\\]]+)?<([^\\]]+)?>\\]'
2个回答

6
这对我有效:
SELECT '[sometext<someothertext>]' REGEXP '\\[([^[.right-square-bracket.]]+)?<([^[.right-square-bracket.]]+)?>\\]$';

0

你的最终正则表达式看起来正确,并且在Firefox / JS中一旦反斜杠得到转义就可以使用。不过似乎MySQL不支持原生捕获组...也许这就是问题所在。

也许这个链接会有帮助:http://mysqludf.com/lib_mysqludf_preg/

此外,您可以尝试使用*代替+?用于您的否定右括号。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接