2009-06-05 4 views
3

Я пытаюсь сопоставить строки, такие как '[sometext <someothertext>]' (то есть левая квадратная скобка, текст, левая угловая скобка, текст, прямоугольная скобка, прямоугольная скобка) внутри столбца в MYSQL. Первоначально я использовал следующий запрос (обратите внимание, что, поскольку регулярные выражения запросов экранируются дважды в MySql, вы должны использовать два обратных слеша, где вы обычно используете один):mySQL Regexp с квадратными скобками

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.]]]+?>\\]' 

UPDATE:

Следующий запрос выполняется без ошибок, но не возвращает ни одной строки, даже если я знаю, что есть столбцы которые соответствуют тому, что я ищу (на основе моего исходного запроса в верхней части):

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

ответ

6

Это работает для меня:

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

Ваше окончательное регулярное выражение выглядит правильно и работает в Firefox/JS, как только слэши неэкранированный. Не похоже, что MySQL поддерживает группы захвата изначально, хотя ... Возможно, в этом и проблема.

Возможно, это будет полезно: http://mysqludf.com/lib_mysqludf_preg/

Кроме того, вы можете попробовать * вместо +? для ваших отрицательных квадратов справа.

* означает 0 или более повторений (жадных)
+? означает 1 или более повторений (ленивые)

Смежные вопросы