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

ui7jx7zq  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(399)

如果值是重复的组的一部分,如何使用regex递归地捕获值?
我在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表示数组:{number of elements},在{}之间i:0表示元素0,i:1表示元素1等,然后实际值s:2:“ca”表示长度为2的字符串
第一个数组有2个元素,第二个数组有1个元素,最后一个数组有4个元素
我在mysql数据库中有这些数据,我没有选择用后端代码来解析这些数据-这必须在mysql中完成(10.0.23-mariadb-log)
重复图案位于花括号内重复的数目是可变的(如在3个示例中,每个示例有不同数目的重复图案),重复图案的数目由第3个位置的数字定义(如果有帮助)
第一个例子是a:2,因此有两个重复块:
i:0;s:2:“或”;
一:1;s:2:“wa”;
我只想提取粗体的值
所以我想出了这个正则表达式 ^a:(?:\d+):\{(?:i:(?:\d+);s:(?:\d+):\"(\w\w)\";)+}$ 它捕获了我想要的值,但问题是它只捕获每个重复组中的最后一个值
所以回到这个例子,我们会发现
佤邦
加利福尼亚州
佤邦
我想要的是
或| wa
加利福尼亚州
ca | id |或| wa
以下是我可以使用的特定于语言的regex函数:
https://mariadb.com/kb/en/library/regular-expressions-functions/
我不管用哪一个来解决这个问题
最终,我需要一个合理的形式,可以呈现给客户,如ca,id,或ca | id |或
目前的想法是,也许这不可能在一个线性,我必须写一个多步骤函数,其中
提取花括号之间的重复部分
然后以某种方式迭代每个重复部分
然后在每个
然后返回结果作为一个字符串与分离的元素

d7v8vwbk

d7v8vwbk1#

我怀疑这样的抓捕是否可能。然而,这可能会为您的特定目的做这项工作。

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

基本上,这适用于输入字符串(或列) str1 喜欢
拆下第一部分
用所需字符串替换每个单元格
删除最后2个字符, ,} 瞧!你得到一根绳子 CA,ID,OR .
阿夫特诺特
当序列化之前的原始数组为空时(这取决于它是如何序列化的),它可能工作得很好,也可能工作得不好。

相关问题