Регулярное выражение не работает с одинарными / двойными кавычками - PullRequest
0 голосов
/ 09 мая 2019

У меня есть поле с именем myfield, которое содержит эту строку:

{'Content-Language': 'en', 'X-Frame-Options': 'SAMEORIGIN', 'X-Generator': 'Drupal 7 (http://drupal.org)', 'Link': '<https://01.org/node>; rel="shortlink"', 'Some-Header-Key': 'max-age=31; addSomething', 'Content-Encoding': 'gzip'}

Я хочу захватить 'Some-Header-Key': 'max-age=31; addSomething', где: 1) 'Some-Header-Key', max-age - фиксированные значения, которые должны всегдаприсутствовать.

2) addSomething является необязательным.

3) Между двойным двоеточием и знаком равенства может быть один или несколько пробелов

4) Общим формальным является «ключ»: «значение» с одинарными или двойными кавычками.

5) ([^""|'])*, чтобы сказать: ноль или более символов, которые не являются одинарными или двойными кавычками.Это для захвата addSomething.

Я написал этот запрос:

select myfield
from mytable
where mycol regexp "('|"")Some-Header-Key('|"")\s*:\s*('|"")([^""|'])*max-age\s*=\s*[0-9]+([^""|'])*('|"")";

Но он ничего не возвращает !!хотя myfield содержит приведенную выше строку примера.

Когда я скопировал значение поля во внешний текстовый файл и запустил регулярное выражение в grep, регулярное выражение правильно захватило строку.

Что не так в MySQL?Я использую MySQL Workbench 8.0 в Ubuntu 18.04.

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Ваша проблема с \s в вашем выражении регулярного выражения. Версии MySQL до 8 не поддерживают эту нотацию, вам нужно использовать символьный класс [:blank:] вместо, т.е.

where mycol regexp "('|"")Some-Header-Key('|"")[[:blank:]]*:[[:blank:]]*('|"")([^""|'])*max-age[[:blank:]]*=[[:blank:]]*[0-9]+([^""|'])*('|"")"

В MySQL 8 вы можете использовать \s, но вам необходимо избежать обратной косой черты, поскольку MySQL использует в строках синтаксис перехода в стиле C, поэтому \s просто переводит в s. Поэтому измените \s на \\s, и оно должно работать:

where mycol regexp "('|"")Some-Header-Key('|"")\\s*:\\s*('|"")([^""|'])*max-age\\s*=\\s*[0-9]+([^""|'])*('|"")"

Демонстрация на dbfiddle

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

Не одиночные или двойные кавычки: [^'"]
Ноль или более таких: [^'"]

Либо одинарная кавычка, либо две двойные кавычки: ('|"")
Либо двойная кавычка, либодве одинарные кавычки: ("|'')

Одна из цитат любого типа: ['"] или ('|")
Строка в одинарных кавычках: '[^']*'
Строка в двойных кавычках: "[^"]*"
Любой из вышеперечисленных: ('[^']*'|"[^"]*")

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

my_json REGEXP "('[^']*'|\"[^\"]*\")"

Если вы используете что-то, что «связывает» для вас, вам не нужно совершать побег.PHP имеет mysqli_real_escape_string и add_slashes.

Но ... Если вы собираетесь использовать JSON, вам следует обновить MySQL 5.7 или MariaDB 10.2, чтобы вы могли использовать функции JSON вместо REGEXP.

...