
本文介绍一种基于正则表达式的 Python 方法,可自动提取 COBOL MODIFY MAP CURSOR 语句中的游标位置与字段列表,并生成标准、可扩展的 JSON 结构,支持任意数量及带下标的字段。
本文介绍一种基于正则表达式的 python 方法,可自动提取 cobol `modify map cursor` 语句中的游标位置与字段列表,并生成标准、可扩展的 json 结构,支持任意数量及带下标的字段。
在企业级遗留系统集成中,常需将 COBOL 屏幕定义(如 CICS MAP 命令)转换为现代数据格式(如 JSON)以供前端或 API 消费。针对形如 MODIFY MAP CURSOR AT NBS-DS-01(1) FOR FIELD (NBS-DS-01, NBS-DS-02(2), NBS-DS-03(3)) 的语句,核心目标是结构化提取游标定位符与字段集合,且保持解析逻辑对字段数量、括号下标、空格等变化具有鲁棒性。
以下是一个轻量、可复用的 Python 解析函数:
import re
import json
def cobol_to_json(statement: str) -> str:
"""
将符合规范的 COBOL MODIFY MAP CURSOR 语句解析为 JSON 字符串。
支持动态字段列表(含带下标的字段,如 NBS-DS-02(2)),自动去除首尾空格。
"""
# 正则说明:
# - r"MODIFY MAP CURSOR AT ([\w-]+\(\d+\))" → 匹配游标:字母/数字/短横线 + (数字)
# - r"FOR FIELD \(([\w-]+(?:\(\d+\))?(?:, [\w-]+(?:\(\d+\))?)*)\)" → 匹配括号内逗号分隔的字段组
pattern = r"MODIFY MAP CURSOR AT ([\w-]+\(\d+\)) FOR FIELD \(([\w-]+(?:\(\d+\))?(?:, [\w-]+(?:\(\d+\))?)*)\)"
match = re.match(pattern, statement.strip())
if not match:
raise ValueError(f"Invalid COBOL statement format: '{statement}'")
cursor = match.group(1)
fields_str = match.group(2)
fields = [field.strip() for field in fields_str.split(',')]
result = {
"cursor": cursor,
"for": fields
}
return json.dumps(result, indent=4)✅ 使用示例:
stmt = "MODIFY MAP CURSOR AT NBS-DS-01(1) FOR FIELD (NBS-DS-01, NBS-DS-02(2), NBS-DS-03(3))" print(cobol_to_json(stmt))
输出为标准 JSON:
{
"cursor": "NBS-DS-01(1)",
"for": [
"NBS-DS-01",
"NBS-DS-02(2)",
"NBS-DS-03(3)"
]
}? 关键特性与注意事项:
- ✅ 动态适配:正则支持任意长度的字段列表(1 个或 N 个),无需修改代码;
- ✅ 下标兼容:能正确识别 FIELD(1)、FIELD-NAME(2) 等带括号数字的合法 COBOL 标识符;
- ⚠️ 格式约束:当前正则假设语句严格遵循 MODIFY MAP CURSOR AT ... FOR FIELD (...) 模式;若存在大小写混用、额外缩进或注释,建议预处理(如 re.sub(r'\s+', ' ', s).strip());
- ?️ 健壮性增强:生产环境建议捕获 ValueError 并记录原始语句用于审计;
- ? 扩展建议:如需支持更多 COBOL 动作(如 ERASE, SET),可将 pattern 抽象为配置字典,实现多指令路由解析。
该方案兼顾简洁性与可维护性,是连接传统主机逻辑与现代 RESTful 架构的有效桥梁。


















