如何用正则表达式递归地捕获一个值,其中值是重复的组的一部分?
我在mysql数据库中有一个序列化数组 这是序列化数组的3个示例
a:2:{i:0;s:2:"OR";i:1;s:2:"WA";}
a:1:{i:0;s:2:"CA";}
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)\";)+}$
它捕获了我想要的所有值,但问题是它仅捕获了每个重复组中的最后一个
所以回到示例中
我想要的是
以下是我可以使用的特定于语言的正则表达式功能:
https://mariadb.com/kb/en/library/regular-expressions-functions/
我不在乎用哪个来解决问题
最终,我需要以可以呈现给客户的明智形式使用此功能,例如CA,ID或OR或CA | ID | OR
目前的想法可能是不可能在一个直线上实现,我必须在其中编写一个多步函数
答案 0 :(得分:0)
我怀疑这样的捕获是否可能。但是,这可能会为您的特定目的完成这项工作。
REGEXP_REPLACE(
REGEXP_REPLACE(
REGEXP_REPLACE(str1, '^a:\\d+:\{', ''),
'i:\\d+;s:\\d+:\"(\\w\\w)\";',
'\\1,'
),
'\,?\}$',
''
)
基本上,这与输入字符串(或列)str1
类似
,}
瞧!您得到一个字符串CA,ID,OR
。
Aftenote
当序列化之前的原始数组为空时(取决于序列化的方式),它可能会或可能无法正常工作。