如何用正则表达式提取SAP Form Routine的参数及名称?
SAP Form Routine 例程名称与参数的正则提取方案
需求概述
需要从SAP FORM签名中精准提取两类信息:
- 例程名称(如示例中的
get_vbrk_data) USING、CHANGING关键字对应的参数列表,每个参数需包含参数名与数据类型
示例FORM签名:
FORM get_vbrk_data USING cs_bil_number TYPE VBELN CHANGING cs_vbrk TYPE vbrk cs_vbak TYPE vbak.
正则提取方案
采用分阶段匹配的方式,比单一正则更灵活易维护:
阶段1:提取例程名称与整体参数文本
用以下正则捕获核心信息:
^FORM\s+(\w+)\s+(.*)\.$
- 分组1:直接获取例程名称
- 分组2:捕获包含
USING/CHANGING的完整参数字段
阶段2:拆分参数类型与具体参数
先对阶段1得到的参数字段,用此正则拆分USING/CHANGING段:
\b(USING|CHANGING)\s+((?:\w+\s+TYPE\s+\w+\s*)+)
再对每个段内的参数列表,用以下正则拆分单个参数的名称与类型:
(\w+)\s+TYPE\s+(\w+)
提取示例(基于给定FORM签名)
阶段1结果
- 例程名称:
get_vbrk_data - 参数文本:
USING cs_bil_number TYPE VBELN CHANGING cs_vbrk TYPE vbrk cs_vbak TYPE vbak
- 例程名称:
阶段2结果
- USING参数:
- 参数名:
cs_bil_number,类型:VBELN
- 参数名:
- CHANGING参数:
- 参数名:
cs_vbrk,类型:vbrk - 参数名:
cs_vbak,类型:vbak
- 参数名:
- USING参数:
可运行代码示例(Python)
import re form_signature = "FORM get_vbrk_data USING cs_bil_number TYPE VBELN CHANGING cs_vbrk TYPE vbrk cs_vbak TYPE vbak." # 提取例程名称和参数文本 main_pattern = re.compile(r'^FORM\s+(\w+)\s+(.*)\.$') main_match = main_pattern.match(form_signature) if main_match: routine_name = main_match.group(1) params_text = main_match.group(2) # 拆分USING/CHANGING参数段 segment_pattern = re.compile(r'\b(USING|CHANGING)\s+((?:\w+\s+TYPE\s+\w+\s*)+)') segments = segment_pattern.findall(params_text) result = { "routine_name": routine_name, "parameters": {} } # 拆分单个参数的名称与类型 param_pattern = re.compile(r'(\w+)\s+TYPE\s+(\w+)') for seg_type, seg_params in segments: params = param_pattern.findall(seg_params) result["parameters"][seg_type] = [{"name": p[0], "type": p[1]} for p in params] print(result)
输出结果:
{ "routine_name": "get_vbrk_data", "parameters": { "USING": [{"name": "cs_bil_number", "type": "VBELN"}], "CHANGING": [{"name": "cs_vbrk", "type": "vbrk"}, {"name": "cs_vbak", "type": "vbak"}] } }
内容的提问来源于stack exchange,提问作者hech1
相关产品推荐
相关产品推荐

