正则表达式在cobol中查找段落名称

时间:2012-01-05 10:10:46

标签: java regex cobol

在java中读取COBOL文件时,我需要一个正则表达式来匹配段落名称。以下是段落名称的示例..

9800-WRITE-SCREEN-A.
C70-WRITE-ABFGRPPARM.
FGH0-REWRITE-ABFGRPPARM. 
8100-FILE-ERROR.

谢谢

3 个答案:

答案 0 :(得分:4)

许多人认为,因为COBOL很老,所以必须简单......不好的假设。事实上 解析COBOL绝不是微不足道的。您可能会认为扫描COBOL程序 仅识别 PARAGRAPH名称不应该需要一个完整的解析器---但它会有它的 挑战。仅靠正则表达式无法完成任务。

以下是一些提示和注意事项:

  • PARAGRAPH名称可能出现在PROCEDURE DIVISION以外的地方。基于 关于你问题中给出的名字我怀疑你应该只分析 PROCEDURE DIVISION该计划。这是传统的最后一个部门 COBOL程序(假设程序不包含嵌套程序)。 如果您需要分析OO COBOL或嵌套的COBOL程序,则需要 更高级的解析技术 比Regex可以提供的。
  • 将分析限制为包含单个程序的文本文件。有可能 在单一来源“套牌”中编码多个独立程序但不常见 完成了,所以意识到你可能不会优雅地处理这个问题。
  • 对于固定格式的COBOL程序(旧式编码),您可以依赖于这一事实 PARAGRAPH名称将从第8列到第11列之间的某处开始。
  • 对于固定格式COBOL,您需要忽略第1列到第1列中出现的任何文本 6,从第73栏到第一行。
  • 对于固定格式COBOL,包含空格或连字符以外的字符的任何行 应忽略第7列中的内容(这是注释或调试行)。
  • 如果该程序在COPY中包含REPLACEPROCEDURE DIVISION指令, 您的分析将不完整和/或不准确。 COPY可能有潜力 引入包含段落名称和REPLACE的其他源代码 指令可以在文本操作期间更改后续段落的名称 编译阶段(即编译的程序可能有不同的名称 你发现的那个)。这不是常见的做法,而是您需要注意的事项。
  • 由于单个COBOL,延续线可能真的搞乱了一个简单的文本扫描仪 单词(例如段落名称)可以分成多个源行。但是,在 在段落名称的情况下,它们跨越多个并不常见 线。
  • 逗号(“,”)和分号(“;”)字符是“噪音”,几乎可以出现 任何可能发生空间的地方(至少在程序部门内)。您 可能想用空格替换这些来简化 后续分析。
  • 引用文字。 COBOL有一些有趣的引用约定,特别是当时 引用文本跨越多个源代码行。文本引用和继续规则 对于COBOL不同于任何其他 你可能熟悉的语言 - 并且解析真正的麻烦。我不是 甚至会在这里开始解释它们!

如何识别COBOL程序的过程部门中的PARAGRAPH名称? 简单,只需查找由句点(“。”)分隔的单个“单词”。段落名称是单一的 单词(可能包含连字符,字母和/或数字字符),并且始终以 一段时间,然后是一段时期。之前或之后可能(或可能不)是空格 每个时期。

现在在我看来,如果你想识别PARAGRAPH名字,你可能想要 同时识别SECTION个名字。 SECTION名称类似于PARAGRAPH名称,除此之外 接下来是强制性保留字SECTION,后面跟着PRIORITY NUMBERPRIORITY NUMBER已经不再使用了(事实上 它已经过时了,所以你可能不必处理它们。

识别COBOL段落名称的有些缺陷但合理的过程

这不是一个正则表达式,而是一个涉及多个正则表达式和或的过程 文本操作。

  • 假设固定格式COBOL
  • 删除所有引用的文字。简单文本并不难,但是 当涉及延续线时,它变得非常困难。如果是COPY / REPLACE指令 参与其中 - 忘了!
  • 删除注释行(即第7列包含星号)
  • 将第1列到第7列和第73列删除到行尾
  • 删除“PROCEDURE DIVISION”字样前的所有文字
  • 将所有出现的逗号和分号替换为单个空格字符
  • 提取句点之间的所有文字(“。”)
  • 如果提取的文字包含单个单词,则它是PARAGRAPH名称。
  • 如果提取的文本包含两个单词,第二个单词是“SECTION”,那么 第一个单词是SECTION名称。

上述内容并非万无一失,但应足以识别大多数“花园式”COBOL程序中的段落和部分名称。

祝你好运。

答案 1 :(得分:1)

"^[ ]{7,10}([-\\w]+)"

段落名称从第8-11行开始。 $ 1将是这个名字。

答案 2 :(得分:0)

一些规则:

  1. 段落名称从A区(第8-11栏)开始。
  2. 可以包含字符,数字或连字符。
  3. 以点(。)结束。
  4. 没有空格字符。
  5. Regex = ^ [] {7,10}([ - \ w] + \。\ n)