如何用正则提取COBOL风格Move语句的源与目标字段?
解决COBOL Move语句的正则提取问题
首先,你之前的正则写法存在两个核心问题:
- 字段匹配的模式错误,
(\w\.*)*无法正确匹配Customer.Name这种点分隔的标识符(它会匹配单个单词字符加任意个点,而非“单词+点+单词”的结构) - 错误使用正向预查,导致无法定位到目标字段的位置
正确的正则写法
直接通过捕获组分别提取源字段和目标字段,适配COBOL Move语句的格式:
^Move\s+(\w+(?:\.\w+)*)\s+(\w+(?:\.\w+)*)$
正则解释
^和$:限定匹配完整的一行Move语句,避免匹配文本中零散的Move字样Move\s+:匹配关键字Move及其后的一个或多个空白字符- 第一个捕获组
(\w+(?:\.\w+)*):匹配源字段,其中:\w+:匹配字段的起始标识符(如Customer)(?:\.\w+)*:非捕获组,匹配可选的“点+标识符”结构(如.Name),支持多层嵌套的字段
\s+:匹配源字段与目标字段之间的空白分隔符- 第二个捕获组
(\w+(?:\.\w+)*):匹配目标字段,规则与源字段一致
测试效果
对于输入Move Customer.Name New.Name:
- 捕获组1:
Customer.Name(源字段) - 捕获组2:
New.Name(目标字段)
你的原有正则问题分析
- 第一个正则
(?<=Move\s*)(\w\.*)*(?<=.*):(\w\.*)*模式错误,无法正确匹配点分隔的字段结构- 末尾的
(?<=.*)是无效的正向预查,没有实际匹配逻辑,也无法帮助定位目标字段
- 第二个正则
(?<=Move\s*(\w\.*)*)(\w\.*)*(?<=.*):- 正向预查
(?<=Move\s*(\w\.*)*)会贪婪匹配到源字段的结尾位置,但预查是零宽度匹配,后续的(\w\.*)*会从预查的位置开始匹配,而此处之后是空白字符,无法匹配目标字段,最终还是只能拿到源字段
- 正向预查
内容的提问来源于stack exchange,提问作者Nigel Tunnicliffe
相关产品推荐
相关产品推荐

