You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式解析类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+(?:&quot;&quot;(.*?)&quot;&quot;)|(?:\.\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这类多层结构)

问题原因分析

  1. 正向预查逻辑混乱:原正则的预查部分没有正确区分源字段的各种格式(常量、带方括号的变量),导致预查范围错误,匹配到了源字段。
  2. 目标字段匹配不完整:\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_FOCUS
  • GG_EWE.GG_EWE_IN.GP_EWE_PRIORITY
  • GG_EWE.GG_EWE_IN.GP_EWE_CODE
  • GG_EWE.GG_EWE_IN.GP_EWE_SOURCE(自动排除[A])
  • GG_EWE.GG_EWE_IN.GP_EWE_DESC

内容的提问来源于stack exchange,提问作者Nigel Tunnicliffe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:05:03