繁体   English   中英

在单词中拆分行并在Java Regex中删除字符串和数字单词

[英]Split line in words and remove String & Numeric words in Java Regex

如何使用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

在此先感谢Kishore

不,你没有。

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。

那是没有定义的。

没有COMP / COMP-4 / COMP-5 / BINARY,其中可以保留的最大值之类的内容取决于编译器选项。

除非已经对所有正在处理的数据进行了严格的标准化,否则请不要尝试执行此操作。

另外,VALUE一词对您没有用,它是与您想要的VALUE子句相关的实际内容,单数形式,当存在时,VALUE在级别01-49上是可选的,或者可以是数量不限的多个项目a Level88。另外,您忽略了位数或字节数(它取决于PICture,甚至是偶数,奇数还是由于编译选项而有所不同)。

以前,您被问到您正在以编程方式查看COBOL程序时在做什么,而没有提及这一点。

如果要让程序理解大型机上的COBOL,则该程序已经存在,它是Enterprise COBOL编译器。

如果您确实想通过尝试“理解” COBOL程序来做某事,则至少可以使您的任务数量级更容易,并使用编译器生成的编译列表。 您仍然必须计算出小数位数和OCCURS的次数,但是这些都是次要的事情,可以在有限的上下文中具体查找,这些内容可以由编译列表中的数据提供。

而且,如果您确实需要忽略与VALUE相关联的值,则可以将比喻常量(空格,低值,高值,零(S / ES),报价(S))处理为好吧,加上NULL,您可能会在USAGE POINTER项目上找到VALUE。 您还需要注意,这些可以在给定数据项所属的组中指定。

现在时间允许一些扩展,因此请查看以下内容:

   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 Mainframe上的COBOL程序,请使用所有清单选项对其进行编译,然后使用清单。 或查看《企业COBOL编程指南》中的SYSADATA附录,并使用编译器选项生成该数据(这将花费更长的时间进行编译,但是如果需要完成多个不同的任务,则将使您的工作量减少(您有两个已经))。

如果您尝试做其他任何事情,那么您正在寻找大量工作。 如果您不熟悉COBOL,并且没有足够的知识可用于该设计,那么您的结果充其量将是“修补”的。

如果您对以前与此相关的问题得到了更完整的回答,那么您还可以保存以上所有内容。

以下是一些SO问题的链接,如果您希望继续使用其他解决方案,这些链接可能会对您有所帮助:

生成EBCDIC数据文件的记录布局。

是否有Python库来解析和处理COBOL代码?

有免费的(如啤酒中的)流程图生成器用于COBOL代码吗?

我分三个阶段获得了解决方案阶段1:首先删除所有字符串

String line = srcLine.replaceAll("((?:\"(?:[[^\"]|\"\"]*)\")|(?:\'(?:[[^\']|\'\']*)\'))", "");

阶段2:用文字打破界限

Pattern pattern = Pattern.compile("\\b(?:(?<=\")[^\"]*(?=\")|(?<=\\')[^\\']*(?=\\')|[\\w\\d-]+)\\b");

Pahse 3:最后丢弃数字数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM