正则表达式解析类COBOL语法:提取Move语句目标字段(排除方括号内容)
COBOL Move语句目标字段提取正则问题排查与修正
我正在扩展类COBOL解析器,需要提取Move语句的目标字段,但要排除元素后的方括号内容(如[B])。示例代码如下:
Move GLB.SPACES[B] GG_EWE.GG_EWE_IN.GP_EWE_FOCUS Move 0 GG_EWE.GG_EWE_IN.GP_EWE_PRIORITY Move "667" GG_EWE.GG_EWE_IN.GP_EWE_CODE Move "CUS01" GG_EWE.GG_EWE_IN.GP_EWE_SOURCE[A] Move "Invalid customer type's for this screen" GG_EWE.GG_EWE_IN.GP_EWE_DESC
当前使用的正则表达式:
(?<=\bMove\s+(?:""(.*?)"")|(?:\.\w+)*(\[\w+\])?\s+)\w+(?:\.\w+)
现有问题
- 错误匹配了源字段(如
GLB.SPACES[B]) - 仅能匹配目标字段的前两部分(如
GG_EWE.GG_EWE_IN,而非完整的GG_EWE.GG_EWE_IN.GP_EWE_PRIORITY) - 无法适配任意层级的目标字段(如
A.B.C.D.E这类多层结构)
问题原因分析
- 正向预查逻辑混乱:原正则的预查部分没有正确区分源字段的各种格式(常量、带方括号的变量),导致预查范围错误,匹配到了源字段。
- 目标字段匹配不完整:
\w+(?:\.\w+)只能匹配X.Y这种两层结构,无法支持多层级的连续.+标识符组合。
修正方案
使用以下正则表达式:
(?<=\bMove\s+(?:".*?"|\w+(?:\.\w+)*(?:\[\w+\])?)\s+)\w+(?:\.\w+)*
正则解释
- 预查部分:
(?<=\bMove\s+(?:".*?"|\w+(?:\.\w+)*(?:\[\w+\])?)\s+)\bMove\s+:匹配Move关键词及后续空白(?:".*?"|\w+(?:\.\w+)*(?:\[\w+\])?):匹配源字段的两种情况".*?":匹配带双引号的字符串常量\w+(?:\.\w+)*(?:\[\w+\])?:匹配变量(支持多层级,可选带方括号后缀)
\s+:匹配源字段与目标字段之间的空白
- 目标字段匹配部分:
\w+(?:\.\w+)*\w+:匹配第一个标识符(?:\.\w+)*:匹配任意数量的.+标识符组合,支持任意层级的目标字段
效果验证
对示例代码应用修正后的正则,将正确提取以下目标字段:
GG_EWE.GG_EWE_IN.GP_EWE_FOCUSGG_EWE.GG_EWE_IN.GP_EWE_PRIORITYGG_EWE.GG_EWE_IN.GP_EWE_CODEGG_EWE.GG_EWE_IN.GP_EWE_SOURCE(自动排除[A])GG_EWE.GG_EWE_IN.GP_EWE_DESC
内容的提问来源于stack exchange,提问作者Nigel Tunnicliffe
相关产品推荐
相关产品推荐

