【问题标题】:Regex that identifies sections in COBOL标识 COBOL 中的部分的正则表达式
【发布时间】:2014-08-06 06:20:41
【问题描述】:

我正在为 Brackets 定制一个大纲插件,该插件使用正则表达式来识别当前打开文件的大纲。

使用 regex101.com 我创建了以下正则表达式(使用环视来确定该行以七个空格开头并以 'SECTION.' 结尾):

(?<=^       )([A-Za-z\-0-9]*)(?= SECTION\.[ ]*$)

根据 regex101.com 可以,但是当通过 jshint/jslint 验证时,它表明它是无效的。当我测试它时,它不起作用(我怀疑 JSHint/JSLint 是正确的)。

以下是我希望获得 2000-GET-EXPECTED-BY-DATE 和 2020-GET-DUE-DATE 的一些 cobol 代码示例。

          ...
      2000-GET-EXPECTED-BY-DATE SECTION.
          MOVE '2' TO W10-OPTION.

          ...

          ELSE                                                     
              MOVE 'Y' TO W10-NO-ERRORS                         
          END-IF.                                                  

      2017-EXIT.                                                   
          EXIT.                                                   
     /
      2020-GET-DUE-DATE SECTION.
      2020.

          MOVE 'N' TO W10-USER-INPUT-DUE-DATE-SW.
          MOVE '1' TO W10-OPTION.
          ...

所以我的问题是:

  • 正则表达式是否有效?
  • 如果无效,那我做错了什么?
  • 我应该如何编写正则表达式来查找每个部分的名称?

【问题讨论】:

  • 如果前 6 个字符包含行号或版本信息怎么办???。许多 Cobol 编译器会接受前 6 个字符中的任何内容???
  • 此外,一个 SECTION 可以后跟一个数字(现在极不可能看到),句号/句号不需要立即跟在它后面。 SECTION 不必与过程名称在同一行,终止它的句号/句点也不必。如果你想要一些通用的东西,那么你就有了更多的内容。如果某些特定于您的系统,那么您就有机会。
  • @BruceMartin 我将它用于已知代码,这些代码在部分名称之前只有空格。
  • @BillWoodger 这是我们遗留代码特有的,我们没有您描述的场景。
  • +1 用于混合正则表达式和 Cobol。

标签: regex cobol regex-lookarounds adobe-brackets


【解决方案1】:

这对我来说可以找到带有“SECTION”的行:

^[ ]{7}(.*)[ ]SECTION\.$

演示: http://regex101.com/r/zC1xY6/2

如果您只想要部分名称:^[ ]{7}\d+\-(.*)[ ]SECTION\.$

【讨论】:

  • 谢谢你,珍妮,这非常适合我想做的事情(我将使用包含全名的那个。我将不得不研究你使用的选项,我想我将需要使用环顾四周。任何洞察为什么我的失败?
  • 如果分节行之前有一个空行,那么它报告与前导空格匹配。如果该部分之前的行有空格,则它将前导空格的数量增加空格的数量。它似乎从前一个非空白行的末尾匹配到第 7 个位置之后的第一个非空白字符。请看:regex101.com/r/hV8tY7/2
  • 这是因为 \s 也匹配空格、制表符和换行符。我已编辑答案以使用 [ ] 来识别空格。
  • 谢谢珍妮,第一个现在正在工作。但是,第二个仅在前一行有值时才有效,如果有空行则不会拾取它。
【解决方案2】:

事实证明,我使用的方法确实有效,有两个 cmets:

  • 通过regex101.com使用时需要添加全局和多行修饰符,
  • 它的执行速度非常慢,以至于 regex101.com 在大型程序上超时。

但是我发现(通过 regex101.com 上的实验)如果我将其更改为

^       (.*)(?= SECTION\.[ ]*$)

然后它没有超时问题。似乎如果我使用^[ ]{7} 作为前缀或者我使用([A-Za-z0-9-]*) 作为捕获组来匹配名称,那么它会非常慢。

主要问题似乎是(.*) 的性能与([A-Za-z0-9-]*) 相比,后者要慢很多。

我可以在 regex101.com 上使用后面的外观:(?&lt;=^ )(.*)(?= SECTION\.[ ]*$),但是 JSLint/JSHint 出现错误。所以我会避免使用它。

我已经在括号大纲程序的一个分支中测试了第一个^ (.*)(?= SECTION\.[ ]*$),它可以工作! :-)

【讨论】:

  • 不错的想法。具有大量数据的速度测试对于改进您的正则表达式总是合理的。 (.*) 当然更快,因为它不必匹配字符。它只需要其中任何一个。
  • 谢谢@JennyO'Reilly,你说的很对,字符匹配是个问题。我已经接受了你的回答,因为它是第一个,只有我对正则表达式的新手让我没有意识到 \s :-) 基于一个非常大的程序,使用前瞻或不使用前瞻时性能似乎没有太大差异.
猜你喜欢
  • 1970-01-01
  • 2017-12-08
  • 2011-12-19
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
相关资源
最近更新 更多