2011-03-14 49 views
0

我想知道什麼是最好的方式去解析「主機」名稱從oracle連接字符串。下面是一個例子的連接字符串:通過已知段的字符串解析

數據 源=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = MYHOST)(PORT = MyPort上)))(CONNECT_DATA =(SERVER = DEDICATED )(SERVICE_NAME = MyOracleSID)))

而且我在String。什麼是返回「MyHost」的最佳方式。也將是很好,如果它的工作對雙連接字符串,例如:

((數據 源=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = MyHost1)(PORT = MyPort1) )(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = MyOracleSID1))))(Data Source =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = MyHost2)(PORT = MyPort2) CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = MyOracleSID2)))))

會返回「MyHost1」和「MyHost2」。

試圖編寫一個方法,它接收連接字符串並將字符串數組列表中的主機/主機吐出。

回答

3

使用像這樣的正則表達式應該可以工作:\(HOST=([^)]+)\)

不要忘了在Java中String文字的反斜槓:

Pattern hostPattern = Pattern.compile("\\(HOST=([^)]+)\\)"); 

創建從Patttern和你輸入字符串Matcher使用matcher()並調用find()直到它返回false。使用group(1)獲取主機名:

Matcher m = hostPattern.matcher(input); 
while (m.find()) { 
    System.out.println(m.group(1)); 
} 
+0

如何應用該模式的字符串,所以我可以得到主機名作爲回報?不太熟悉模式,但我之前使用它們來分割字符串,但從未提取值。 – 2011-03-14 13:45:55

+0

不是非貪婪的通配符會更直接一點嗎? '\(HOST =(。*?)\)'或者我錯過了什麼? – 2011-03-14 13:52:00

+0

@Mark:它會一樣好,我只是習慣了這個版本;-) – 2011-03-14 13:54:11

1

擴展勒夫的想法(我還沒有在使用了一段時間的ArrayList所以它可能不完全正確):

public List<String> getHosts(String conString) { 
    List<String> conns = new ArrayList<String>() 
    Pattern hostPattern = Pattern.compile("\\(HOST=([^)]+)\\)"); 
    Matcher m = hostPattern.matcher(conString); 
    while(m.find()) { 
    conns.add(m.group(1)); 
    } 
    return conns; 
} 

編輯:謝謝你的修復巴特!

0

正則表達式\(HOST =(。*?)\)將分別與包含「MyHost1」和「MyHost2」的兩個組匹配「(HOST = MyHost1)」和「(HOST = MyHost2)」部分。

乾杯,

埃德