Захватывать значение из повторяющейся группы на каждой итерации (в отличие от только что последнего вхождения) - PullRequest
0 голосов
/ 23 октября 2018

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

У меня есть сериализованный массив в базе данных mysql. Это 3 примера сериализованного массива

  1. a:2:{i:0;s:2:"OR";i:1;s:2:"WA";}

  2. a:1:{i:0;s:2:"CA";}

  3. a:4:{i:0;s:2:"CA";i:1;s:2:"ID";i:2;s:2:"OR";i:3;s:2:"WA";}

a: 1 обозначает массив: {число элементов}, затем между {} i: 0 означает элемент 0, i: 1 означает элемент 1 и т. Д., Тогда фактическое значение s: 2: «CA» означает строку с длиной2

, поэтому у меня есть 2 элемента в первом массиве, 1 элемент во втором и 4 элемента в последнем

У меня есть эти данные в базе данных MySQL, и у меня нет опции для анализаэто с внутренним кодом - это должно быть сделано в mysql (10.0.23-MariaDB-log)

повторяющийся шаблон находится внутри фигурных скобок, число повторов является переменным(как в 3 примерах каждый имеет различное количество повторяющихся шаблонов), количество повторяющихся шаблонов определяется числом в 3-м пosition (если это поможет)

для первого примера это: 2 : и поэтому есть 2 повторяющихся блока:

i: 0; s: 2: " ИЛИ";

i: 1; s: 2:" WA";

Я только хочу извлечь значения в полужирный

Итак, я придумала это регулярное выражение ^a:(?:\d+):\{(?:i:(?:\d+);s:(?:\d+):\"(\w\w)\";)+}$

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

Вернемся к примеру: 1053 *

  1. WA
  2. CA
  3. WA

Что бы я хотелхотеть это

  1. ИЛИ | WA
  2. CA
  3. CA | ID | ИЛИ | WA

это специфичные для языка функции регулярных выраженийдоступны для меня:

https://mariadb.com/kb/en/library/regular-expressions-functions/

Мне все равно, какой из них используется для решения проблемы

В конечном счете, мне нужно это в разумной форме, которая может быть представленаклиенту, например, CA, ID, ИЛИ или CA | ID | ИЛИ

Текущие мысли, возможно, это невозможно ви я должен написать многошаговую функцию, в которой

  1. извлекает повторяющуюся часть между фигурными скобками
  2. , а затем каким-то образом перебирает каждую повторяющуюся часть
  3. затем используйте регулярные выражения для каждого
  4. , затем возвращайте результаты в виде одной строки с разделенными элементами

1 Ответ

0 голосов
/ 23 октября 2018

Я сомневаюсь, что такой захват возможен.Тем не менее, это, вероятно, будет работать для вашей конкретной цели.

REGEXP_REPLACE(
  REGEXP_REPLACE(
    REGEXP_REPLACE(str1, '^a:\\d+:\{', ''),
    'i:\\d+;s:\\d+:\"(\\w\\w)\";',
    '\\1,'
  ),
  '\,?\}$',
  ''
)

По сути, это работает с входной строкой (или столбцом) str1 подобно

  1. удалить первыйpart
  2. замените каждую ячейку на нужную вам строку
  3. удалите последние 2 символа ,}

и вуаля!Вы получаете строку CA,ID,OR.

Aftenote
Это может работать или не работать хорошо, если исходный массив до сериализации пуст (зависит от того, как он сериализован).

...