Неэффективное регулярное выражение в MySQL 8 - PullRequest
0 голосов
/ 23 мая 2019

У меня есть этот запрос, который должен исключать некоторые символы (хотя внутри квадратных скобок и начинается с ^). Итак, мой запрос:

select col
from tbl
where col regexp '[^<\\\]*=[^<\\\]*(;|$)';

У меня есть запись с этим значением:

PHPSESSID=b86698ec6da0879\cd5f4;
PHPSESSID=b86698ec6da0879cd;

Запрос возвращает OK (что означает проблему в регулярном выражении. Обычный запрос вернет другие записи, которые не содержат \ или 0 записей.

1 Ответ

0 голосов
/ 26 мая 2019

Пожалуйста, попробуйте с 2 обратными слешами и с 4 (вместо 3). Вот логика:

  1. Некоторые слои кода используют \ в качестве escape-символа. Таким образом, \s используется для «пробела», а не s и т. Д. Затем саму обратную косую черту необходимо экранировать: \\.

  2. Другой слой кодов должен избегать вещей. Чтобы \s не был просто s, обратная косая черта должна быть экранирована, поэтому \\s. Для \\ все, что он знает, это то, что есть две обратные косые черты. Так что каждому нужно убежать: \\\\.

Я видел, например, это с PHP и регулярными выражениями.

Работая задом наперед, я бы ожидал

[^<\\\]
-->
[^<\]    -- after removing one layer
-->
[^<]     -- after removing the second layer

Если ваше регулярное выражение 3-bs не замечает обратную косую черту, мой анализ, вероятно, верен.

Версия 4-бс:

[^<\\\\]  -->
[^<\\]    -->
[^<\]     -- (At this point `\` is just another char, as you wanted)
...