2013-05-19 38 views
0

我有這個字符串,這個id使用Java模式來分隔。第一行之後還有一個回車符。分隔符是|使用Java模式的字符串分隔符

MSH|^~\&|Unicare^HL7CISINV10.00.16^L||IBA||||ADT^A03|3203343722|P|2.3.1||||| 
EVN|A03 

我使用了下面的代碼。

Pattern pattern = Pattern.compile("([^|]++)*"); 
Matcher matcher = pattern.matcher(str); 
while (matcher.find()) { 
    System.out.println("Result: \"" + matcher.group() + "\""); 
} 

這樣做基本上顯示了每個分隔符的空字符。我想找到忽略這些。任何修改正則表達式的機會都可以被忽略。

在此先感謝。

+0

我不明白爲什麼你沒有嘗試它,而你已經寫了它的代碼? –

+0

檢查但沒有工作。忘了提及它。 – nixgadgets

+0

啊對不起。我建議你可能喜歡這篇文章:http://www.vogella.com/articles/JavaRegularExpressions/article.html –

回答

3

我相信String#split()是您需要簡單:

String src = "MSH|^~\\&|Unicare^HL7CISINV10.00.16^L||IBA||||ADT^A03|3203343722|P|2.3.1|||||\r\nEVN|A03\r";; 
String[] ss = src.split("\\|+"); 
for (String s : ss) { 
    System.out.println(s); 
} 

輸出:

MSH 
^~\& 
Unicare^HL7CISINV10.00.16^L 
IBA 
ADT^A03 
3203343722 
P 
2.3.1 
           <--- there is a \r\n in the string at this point 
EVN 
A03 

如果你想要去使用Pattern,您可以使用正則表達式[^|]+

String str = "MSH|^~\\&|Unicare^HL7CISINV10.00.16^L||IBA||||ADT^A03|3203343722|P|2.3.1|||||\r\nEVN|A03\r";; 
String[] ss = str.split("\\|+"); 
for (String s : ss) { 
    System.out.println("Split..: \"" + s + "\""); 
} 
Pattern pattern = Pattern.compile("[^|]+"); 
Matcher matcher = pattern.matcher(str); 
while (matcher.find()) { 
    System.out.println("Pattern: \"" + matcher.group() + "\""); 
} 

輸出(兩者完全相同):

Split..: "MSH" 
Split..: "^~\&" 
Split..: "Unicare^HL7CISINV10.00.16^L" 
Split..: "IBA" 
Split..: "ADT^A03" 
Split..: "3203343722" 
Split..: "P" 
Split..: "2.3.1" 
Split..: " 
EVN" 
Split..: "A03 
" 
Pattern: "MSH" 
Pattern: "^~\&" 
Pattern: "Unicare^HL7CISINV10.00.16^L" 
Pattern: "IBA" 
Pattern: "ADT^A03" 
Pattern: "3203343722" 
Pattern: "P" 
Pattern: "2.3.1" 
Pattern: " 
EVN" 
Pattern: "A03 
" 
+0

優秀。我正在考慮使用模式,但我也可以使用拆分。 – nixgadgets

+0

讓分割模式匹配多個'|'字符真的很明智嗎?不能'||'表示空字段?!? –

1

這個正則表達式不起作用。當你寫++時,你想要做什麼? *量詞將不是工作組,只在字符和字符類。

+0

我的意圖是得到任何不是分隔符的字符並將它們組合在一起 – nixgadgets

+0

您可以在組上使用量詞,但我認爲將它們作爲令牌排除在匹配器之外是棘手的/不可能的。無論哪種方式,像'Scanner'這樣的分隔符都設置爲'|'會讓你用'next()'和'hasNext()'方法很好地遍歷令牌。而不必完全複製輸入行的內容。 –

+0

這裏是一個很好的漫畫閱讀:http://xkcd.com/1171/ –