如何在单词中分割一行并删除String&使用Java Regex的数字单词。这里输入是我收到的,输出是我想要的:
Input:
05 ECPRF-057 PIC S9(4) VALUE +0057 COMP-3.
Output:
ECPRF-057
PIC
S
VALUE
COMP-3
Input:
88 ACCT-LVL-CHG VALUE 'WT ' 'WTO', "AA ",
Output:
ACCT-LVL-CHG
VALUE
先谢谢 基肖尔马布
答案 0 :(得分:5)
不,你没有。
05 ECPRF-057 PIC S9(4) VALUE +0057 COMP-3.
05 ECPRF-057 COMP-3 PIC S9(4) VALUE +0057.
05 ECPRF-057 VALUE +0057 PIC S9(4) USAGE COMP-3.
05 ECPRF-057 VALUE +0057 PIC S9(4) USAGE IS COMP-3.
05 ECPRF-057 VALUE +0057 PICTURE IS S9(4) USAGE IS COMP-3.
05 ECPRF-057 VALUE +0057 PICTURE S9(4) USAGE IS COMP-3.
05 ECPRF-057 VALUE +0057 PIC S9(4) COMP-3.
05 ECPRF-057 VALUE +0057 COMP-3 PIC S9(4).
05 ECPRF-057 VALUE +0057 PACKED-DECIMAL PIC S9(4).
05 ECPRF-057 VALUE +0057 PIC S9(4).
此外,COMP-3可以写为COMPUTATIONAL-3或PACKED-DECIMAL。并且这些都不必在同一条线上,而且往往不会。
这些都是一样的。并制作许多更多组合。我确定,关于最后一个甚至?是的,因为在此之前的某个地方(紧接着,或之前的任意行数)是:
02 ECPRF-057-GROUP COMP-3. (which may also have the combinations relating to COMP-3)
在第二个例子中没有达到88级。
没有:
05 PIC X(20) VALUE SPACE.
没有重复的数据名称,当由更高级别的数据名称“限定”时有效,需要使用IN或OF。
没有REDEFINES。
没有COMP / COMP-4 / COMP-5 / BINARY,其中可以保存的最大值取决于编译器选项。
请不要尝试这样做,除非所有您正在处理的数据已经严格标准化。
另外,单词VALUE对你没用,它是你想要的VALUE子句的实际内容,这是单数,当存在时,VALUE在级别01-49上是可选的,或者可以是无限多个数字在88级上的项目。另外你忽略了数字或字节数(它取决于PICture,甚至数字是偶数,奇数还是由于编译选项而变化)。
之前有人问你是以编程方式查看COBOL程序的,而且没有提到这一点。
如果您希望程序理解大型机上的COBOL,它已经存在,那就是Enterprise COBOL编译器。
如果您真的想通过尝试“理解”COBOL程序来做某事,至少可以使您的任务数量级更容易,并使用编译器生成的编译列表。你仍然需要计算出小数位数,以及发生事件的次数,但这些是可以在有限的上下文中特别寻求的次要事情,可以通过编译列表中的数据提供。
而且,如果你真的需要忽略与VALUE相关的值,你就会得到比喻常数(SPACE(S),LOW-VALUES,HIGH-VALUES,ZERO(S / ES),QUOTE(S))同时处理,加上NULL,你可以在USAGE POINTER项目中找到它作为值。您还需要注意,可以在给定数据项所属的组中指定这些。
现在时间允许一些扩展,所以看看这些:
01 A-GROUP VALUE ZERO.
05 PIC 9.
05 A-NAME-1 PIC S9(4).
05 A-NAME-2 PIC S9999.
05 A-NAME-3 REDEFINES A-NAME-2 PIC 9999.
01 B-GROUP BINARY.
05 PIC 9.
05 B-NAME-1 PIC S9(4).
05 B-NAME-2 PIC S9999.
05 B-NAME-3 REDEFINES B-NAME-2 PIC 9999.
01 C-GROUP COMPUTATIONAL-3.
05 PIC 9.
05 C-NAME-1 PIC S9(4).
05 C-NAME-2 PIC S9999.
05 C-NAME-3 REDEFINES C-NAME-2 PIC 9999.
01 D-GROUP SIGN LEADING SEPARATE.
05 PIC 9.
05 D-NAME-1 PIC S9(4).
05 D-NAME-2 PIC S9999.
05 FILLER REDEFINES D-NAME-2.
10 FILLER PIC X.
10 D-NAME-3 PIC 9999.
如果查看05级定义,所有这些字段在组到组中看起来都是一样的。它们不是,由于01级的附加条款,它们都不同。
我甚至没有刮过表面。 COBOL具有非常广泛的数据定义,可以轻松应用于生成复杂的数据结构。
COBOL是一种古老的语言。许多COBOL程序都是由许多人改变的旧程序,它们具有不同的编码风格和不同的COBOL知识水平。您会在所有程序中找到上述定义吗?不,你能在一些人中找到它们吗?也许。处理数据时无法使用Maybes。
您提取的数据对我没有意义。级别数值很重要,值的内容很重要。字段中的位数以及字节的大小(以字节为单位)都很重要。也许你不需要这些,但我对此表示怀疑。
放弃这条路线。
如果您真的需要“理解”IBM大型机上的COBOL程序,请使用所有列表选项对其进行编译,并使用该列表。或者查看“企业COBOL编程指南”中的SYSADATA附录,并使用编译器选项生成该数据(这将需要更长的时间来编译,但如果您需要完成几个不同的任务,那么您将需要做更少的工作(您有两个)的话))。
如果您尝试做其他任何事情,那么您正在寻找相当多的工作。如果您不熟悉COBOL并且没有可用于设计的良好知识来源,那么您的结果将至多是“不完整”。
如果您对上一个与此相关的问题做出更充分的回答,那么您也可以保存上述所有内容。
以下是SO问题的一些链接,如果您继续寻求其他解决方案,可能对您有所帮助:
Generating Record Layouts for EBCDIC Data Files.
Is there a Python library to parse and manipulate COBOL code?
Is there a free (as in beer) Flow chart generator for COBOL Code?
答案 1 :(得分:0)
我分三个阶段得到了一个解决方案 阶段1:首先删除所有字符串
String line = srcLine.replaceAll("((?:\"(?:[[^\"]|\"\"]*)\")|(?:\'(?:[[^\']|\'\']*)\'))", "");
阶段2:用词语打破
Pattern pattern = Pattern.compile("\\b(?:(?<=\")[^\"]*(?=\")|(?<=\\')[^\\']*(?=\\')|[\\w\\d-]+)\\b");
Pahse 3:最后丢弃数字数据。