FlinkSql用正则解析 gm00102|impId=0015Z3799|v=3|pg=F05|ssd=3799|pos=1|reqId=23bb8f775d324253b1a7ad1ea5249d70|aId=291fe3|asId=prec_appmarket_activation_iaa_relax_select 中的 impId
时间: 2025-05-23 17:06:22 浏览: 15
### Flink SQL 中使用正则表达式提取字符串中的 `impId` 字段值
在 Flink SQL 中,可以借助内置函数 `REGEXP_EXTRACT` 来实现基于正则表达式的字符串解析。此函数允许用户定义一个模式,并从中捕获所需的子组内容[^4]。
对于给定的输入字符串 `'gm00102|impId=0015Z3799|v=3|pg=F05|ssd=3799|pos=1|reqId=23bb8f775d324253b1a7ad1ea5249d70|aId=291fe3|asId=prec_appmarket_activation_iaa_relax_select'`,目标是从中提取 `impId` 的值 (`0015Z3799`)。可以通过如下方式构建查询:
#### 查询语句
```sql
SELECT REGEXP_EXTRACT(
'gm00102|impId=0015Z3799|v=3|pg=F05|ssd=3799|pos=1|reqId=23bb8f775d324253b1a7ad1ea5249d70|aId=291fe3|asId=prec_appmarket_activation_iaa_relax_select',
'impId=([^|]*)',
1
) AS extracted_imp_id;
```
#### 解析过程说明
- **正则表达式**: `'impId=([^|]*)'`
- 这里的模式匹配以关键字 `impId=` 开头的部分。
- 使用括号 `( )` 定义了一个捕获组,用于获取紧随 `impId=` 后的内容直到遇到下一个分隔符(即管道字符 `|`)。这里采用了否定字符类 `[^|]*` 表示任意数量非 `|` 的字符[^5]。
- **函数参数解释**
- 第一参数为待解析的原始字符串;
- 第二参数是用于匹配和捕捉所需部分的正则表达式;
- 第三参数指定了返回哪个捕获组的结果,在这个例子中我们关注第一个也是唯一的捕获组,因此设置为 `1`[^6]。
运行以上 SQL 将得到结果列 `extracted_imp_id`,其值应为 `"0015Z3799"`。
---
### 注意事项
如果源数据存储于表某字段内而非硬编码字符串形式,则需相应修改 SELECT 子句来引用实际列名代替固定字符串实例。例如假设该串存放在名为 logs_data 的表格里且对应列为 raw_string ,那么完整的查询可能是这样写的:
```sql
SELECT REGEXP_EXTRACT(raw_string,'impId=([^|]*)',1) FROM logs_data ;
```
这将针对每一条记录应用同样的规则抽取各自的 impId 值[^7]。
---
阅读全文
相关推荐


















