2012-12-17 181 views
-3

好的我正在關注我一週前發佈的另一個問題。 Unable to parse^character無法顯示標籤

我目前的情況是,現在我能夠解析所需的正則表達式並創建後續元素。我爲每種元素類型創建了標籤。

對於例如我的輸入字符串爲A | 1 | 2 | 3^4 |乙|| 1 | 2 | 3^4^5

所以我在此字符串標籤是A和B

我的輸出應爲(預計)

A1  1 
A2  2 
A3.1 3 
A3.2 4 
B1  (BLANK) //not B 
B2  1 
B3  2 
B4.1 3 
B4.2 4 
B4.3 5 

因爲輸入是B || 1 | 2,所以B1應該是空白的原因。 我的電流輸出來是

element1 A 
element2 1 
element3.1 2 
element3.2 3 
element4 4 
element5 B 
element6  
element7.1 2 
element7.2 3 
element7.3 4 
element7.4 5 

基本上,我試圖構建一個HL7分析器。用準確的標籤進行替換以避免混淆並保持機密性。代碼如下。

公共類分析器{

public static final String ELEMENT_DELIM_REGEX = "\\|"; 

public static void main(String[] args) { 
    String input = "A|1|2|3^4|"; 
    String[] tokens = input.split(ELEMENT_DELIM_REGEX); 
    Element[] elements = new Element[tokens.length]; 
    for (int i = 0; i < tokens.length; i++) { 
     elements[i] = new Element(i + 1, tokens[i]); 
    } 
    for (Element element : elements) { 
     System.out.println(element); 
    } 
} 

}

Element.java 

公共類元素{

public static final String SUB_ELEMENT_DELIM_REGEX = "\\^"; 

private int number; 

private String[] content; 

public Element(int number, String content) { 
    this.number = number; 
    this.content = content.split(SUB_ELEMENT_DELIM_REGEX); 
} 

@Override 
public String toString() { 
    if (content.length == 1) { 
     return "Element " + number + "\t" + content[0]; 
    } 
    StringBuilder str = new StringBuilder(); 
    for (int i = 0; i < content.length; i++) { 
     str.append("Element " + number + "." + (i+1) + "\t" + content[i] + "\n"); 
    } 
    // Delete the last \n 
    str.replace(str.length() - 1, str.length(), ""); 
    return str.toString(); 
} } 
+2

問題應該是獨立的。請不要求我們讀另一個問題(順便說一下,這不是一個線程,因爲這不是論壇)。 –

+0

添加了代碼...我被要求創建另一個問題,因爲我和@jlordo一直在討論這個問題。 – Sid

+0

創建一個單獨的問題並鏈接到它是沒有問題的。只是不*要求*我們讀兩個。 –

回答

1

它可以通過兩個類的一些小的改變來實現:(問你是否不明白代碼中發生了什麼,我只寫了幾條評論,但試圖保持自我解釋)

public class Parser { 

    public static final String ELEMENT_DELIM_REGEX = "\\|"; 

    public static void main(String[] args) { 
     String input = "A|1|2|3^4|B||1|2|3^4^5"; 
     String[] tokens = input.split(ELEMENT_DELIM_REGEX); 
     List<Element> elements = new ArrayList<Element>(); 
     String currentTag = ""; 
     int elementCounter = 1; 
     for (int i = 0; i < tokens.length; i++) { 
      if (tokens[i].matches("\\p{Alpha}+")) { 
       currentTag = tokens[i]; 
       elementCounter = 1; 
       continue; 
      } 
      elements.add(new Element(elementCounter++, currentTag, tokens[i])); 
     } 
     for (Element element : elements) { 
      System.out.println(element); 
     } 
    } 
} 

public class Element { 

    public static final String SUB_ELEMENT_DELIM_REGEX = "\\^"; 

    private int number; 

    private String[] content; 

    private String tag; 

    public Element(int number, String tag, String content) { 
     this.number = number; 
     this.content = content.split(SUB_ELEMENT_DELIM_REGEX); 
     this.tag = tag; 
    } 

    @Override 
    public String toString() { 
     if (content.length == 1) { 
      return tag + "" + number + "\t" + content[0]; 
     } 
     StringBuilder str = new StringBuilder(); 
     for (int i = 0; i < content.length; i++) { 
      str.append(tag + "" + number + "." + (i+1) + "\t" + content[i] + "\n"); 
     } 
     // Delete the last \n 
     str.replace(str.length() - 1, str.length(), ""); 
     return str.toString(); 
    } 
} 

輸出(您輸入A|1|2|3^4|B||1|2|3^4^5

A1  1 
A2  2 
A3.1 3 
A3.2 4 
B1 
B2  1 
B3  2 
B4.1 3 
B4.2 4 
B4.3 5 
+0

@SiddharthSharma有些東西不能用這個解決方案?任何不接受的理由? – jlordo

+0

@jlordo ......它的工作和預期一樣。我需要擦亮一下......我正在睡覺,所以無法接受它。 – Sid

+0

我將單行A | 1 | 2 | 3^4 | B || 1 | 2 | 3^4^5的輸入轉換爲多行輸入。經過幾次試驗後,我意識到它不能通過控制檯完成。所以我將輸入樣式移動到基於文件的輸入。讓我們看看它是如何:) – Sid