在每次迭代中都从重复组中捕获一个值(而不是最后一次出现)

时间:2018-10-23 01:21:54

标签: mysql regex regex-group

如何用正则表达式递归地捕获一个值,其中值是重复的组的一部分?

我在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)中完成此操作< / p>

重复图案在花括号内 重复次数是可变的(例如在3个示例中,每个重复模式的数量都不同), 重复模式的数量由第3个位置的数字定义(如果有帮助的话)

第一个示例是: 2 : 因此有2个重复块:

i:0; s:2:“ OR ”;

i:1; s:2:“ WA ”;

我只想提取粗体

中的值

所以我想出了这个正则表达式 ^a:(?:\d+):\{(?:i:(?:\d+);s:(?:\d+):\"(\w\w)\";)+}$

它捕获了我想要的所有值,但问题是它仅捕获了每个重复组中的最后一个

所以回到示例中

  1. WA
  2. CA
  3. WA

我想要的是

  1. OR | WA
  2. CA
  3. CA | ID | OR | WA

以下是我可以使用的特定于语言的正则表达式功能:

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

我不在乎用哪个来解决问题

最终,我需要以可以呈现给客户的明智形式使用此功能,例如CA,ID或OR或CA | ID | OR

目前的想法可能是不可能在一个直线上实现,我必须在其中编写一个多步函数

  1. 提取花括号之间的重复部分
  2. 然后以某种方式遍历每个重复部分
  3. 然后在每一个上使用正则表达式
  4. 然后将结果作为一个包含分隔元素的字符串返回

1 个答案:

答案 0 :(得分:0)

我怀疑这样的捕获是否可能。但是,这可能会为您的特定目的完成这项工作。

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

基本上,这与输入字符串(或列)str1类似

  1. 删除第一部分
  2. 用所需的字符串替换每个单元格
  3. 删除最后两个字符,}

瞧!您得到一个字符串CA,ID,OR

Aftenote
当序列化之前的原始数组为空时(取决于序列化的方式),它可能会或可能无法正常工作。