MySQL GROUP_CONCAT экранирование

Мне кажется, вы пытаетесь сопоставить теги без «/» в конце. Попробуйте следующее:

<([a-zA-Z][a-zA-Z0-9]*)[^>]*(?<!/)>
13
задан Bill Zeller 16 January 2009 в 23:02
поделиться

8 ответов

Если существует некоторый другой символ, это недопустимо в именах пользователей, можно определить различный символ разделителя с помощью малоизвестного синтаксиса:

...GROUP_CONCAT(name SEPARATOR '|')...

... Вы хотите позволить каналы? или какой-либо символ?

Escape символ разделителя, возможно, с обратной косой чертой, но прежде, чем сделать тот Escape сами обратные косые черты:

group_concat(replace(replace(name, '\\', '\\\\'), '|', '\\|') SEPARATOR '|')

Это будет:

  1. Escape любые обратные косые черты с другой обратной косой чертой
  2. выходят из символа разделителя с обратной косой чертой
  3. , связывают результаты с символом разделителя

, Чтобы получить незавершенные результаты, сделать то же самое в обратном порядке:

  1. разделяет результаты символом разделителя где не предшествовавший обратной косой чертой. На самом деле это немного хитро, Вы хотите разделить его, где этому не предшествуют нечетное число из blackslashes. Этот regex будет соответствовать этому:
    (?<!\\)(?:\\\\)*\|
  2. замена все завершенные символы разделителя с литералами, т.е. замена \| с |
  3. замена все двойные обратные косые черты с обратными косыми чертами ожога, например, замена \\с \
14
ответ дан ʞɔıu 16 January 2009 в 23:02
поделиться
  • 1
    эндоофсетный, that' s, что я имел в виду с " не целый story". – Svante 6 December 2009 в 10:25

REPLACE()

Пример:

... GROUP_CONCAT(REPLACE(name, ',', '\\,')) 

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

3
ответ дан Bill Karwin 16 January 2009 в 23:02
поделиться

Если Вы собираетесь быть выполнением декодирования в Вашем приложении, возможно, просто используйте hex:

SELECT GROUP_CONCAT(HEX(foo)) ...

или Вы могли также поместить длину в них:

SELECT GROUP_CONCAT(CONCAT(LENGTH(foo), ':', foo)) ...

Не то, чтобы я протестировал любой:-D

1
ответ дан derobert 16 January 2009 в 23:02
поделиться
  • 1
    Хорошие наблюдения, +1. I' m задающийся вопросом, хотя, то, почему Douglas Crockford сказал JavaScript, сделало ошибку при заимствовании Математического объекта у Java. – Ionuț G. Stan 7 March 2009 в 23:17

какая зарубка, сказанная действительно, с улучшением - разделитель может быть больше чем одним символом также.

я часто использовал

GROUP_CONCAT(name SEPARATOR '"|"')

, Возможности имени пользователя, содержащего "|", являются довольно низкими, я сказал бы.

0
ответ дан benlumley 16 January 2009 в 23:02
поделиться
  • 1
    @Ferdinand: Я никогда не был планированием использования ничего как " a.max (' 5') ". некоторые функции и константы принадлежат Математического объекта (I' ll обновляют мое сообщение, чтобы ясно дать понять). Те, которые применяются на одно только число, что I' m заинтересованный. То, что можно использовать строки, является положительной стороной все же. – Annan 8 March 2009 в 01:24

Вы входите в ту серую область, где могло бы быть лучше постобработать эту внешнюю сторону мир SQL.

, По крайней мере, это - то, что я сделал бы: я был бы просто ORDER BY вместо GROUP BY и цикл через результаты обработать группировку как фильтр, сделанный на клиентском языке:

  1. Запускаются путем инициализации last_id к ПУСТОМУ УКАЗАТЕЛЮ
  2. Выборка следующая строка набора результатов (если нет большего количества строк, переходят к шагу 6)
  3. , Если идентификатор строки отличается, чем last_id, запускают новую выходную строку:

    a., если last_id не является ПУСТЫМ тогда, производят сгруппированную строку

    , b. устанавливают новую сгруппированную строку = входная строка, но хранят имя как единственный массив элемента

    , c. устанавливают last_id на значение текущего идентификатора

  4. Иначе (идентификатор совпадает с last_id), добавляют название строки на существующую сгруппированную строку.

  5. Возвращаются к шагу 2
  6. Иначе, Вы закончили; если эти last_id не является ПУСТЫМ, тогда производит существующую строку группы.

Тогда Ваш вывод заканчивается включая имена, организованные как массив, и может решить, как Вы хотите обрабатывать/выходить/форматировать их тогда.

, Какой язык/систему Вы используете? PHP? Perl? Java?

0
ответ дан Jason S 16 January 2009 в 23:02
поделиться
  • 1
    Существуют также соображения производительности - value.anything, требует упаковки значения - например, преобразование значения в объект. (Возможно избежать этого иногда, но не в любом из Ваших вероятных вариантов использования), – olliej 8 March 2009 в 02:45

Jason S: Это - точно проблема, с которой я имею дело. Я использую платформу PHP MVC и обрабатывал результаты как Вы, описывают (несколько строк на результат и код для собирания в группу результатов). Однако я работал над двумя функциями для своих моделей для реализации. Каждый возвращается, список всех необходимых полей должен был воссоздать объект, и другой функция, которая, учитывая строку с полями от первой функции, инстанцируйте нового объекта. Это позволяет мне запросить строку от базы данных и легко возвратить ее в объект, не зная внутренности данных, необходимых модели. Это не работает вполне также, когда несколько строк представляют один объект, таким образом, я пытался использовать GROUP_CONCAT для обхождения той проблемы.

0
ответ дан Bill Zeller 16 January 2009 в 23:02
поделиться

Прямо сейчас я позволяю любой символ. Я понимаю, что канал вряд ли обнаружился бы, но я хотел бы позволить его.

Как насчет управляющего символа, который необходимо разделять из входа приложения так или иначе? Я сомневаюсь, что Вам нужно, например, вкладка или новая строка в поле имени.

0
ответ дан bobince 16 January 2009 в 23:02
поделиться
  • 1
    I' ve всегда задавался вопросом почему Вы couldn' t делают 123.method (). Я знаю it' s легче не позволить его из-за плаваний, однако я думаю, что рубин позволяет синтаксис, и это сделало бы все легче! – Annan 27 October 2010 в 07:44

Я бы предложил GROUP_CONCAT (имя SEPARATOR '\ n'), поскольку \ n обычно не встречается. Это может быть немного проще, так как вам не нужно ничего избегать, но это может привести к неожиданным проблемам. Кодирование / декодирование регулярных выражений, предложенное ником, конечно, тоже хорошо.

4
ответ дан 1 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: