MySQL Regexp в квадратных скобках - PullRequest
3 голосов
/ 05 июня 2009

Я пытаюсь сопоставить строки, подобные '[sometext ]' (то есть левая квадратная скобка, текст, левая угловая скобка, текст, правая угловая скобка, правая квадратная скобка) внутри столбца в MySQL. Первоначально я использовал следующий запрос (обратите внимание, что так как запросы регулярных выражений дважды экранируются в 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.]]]+?>\\]'

UPDATE:

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

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

Ответы [ 2 ]

6 голосов
/ 05 июня 2009

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

SELECT '[sometext<someothertext>]' REGEXP '\\[([^[.right-square-bracket.]]+)?<([^[.right-square-bracket.]]+)?>\\]$';
0 голосов
/ 05 июня 2009

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

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

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

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

...