用单词拆分并删除String& Java Regex中的数字单词

时间:2014-01-16 06:16:46

标签: java regex cobol

如何在单词中分割一行并删除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

先谢谢 基肖尔马布

2 个答案:

答案 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:最后丢弃数字数据。