簡體   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