Разобрать строку для известного раздела - PullRequest
0 голосов
/ 14 марта 2011

Мне было интересно, как лучше всего разобрать имена "HOST" из строк соединения оракула. Вот пример строки подключения:

Данные Источник = (ОПИСАНИЕ = (ADDRESS_LIST = (АДРЕС = (ПРОТОКОЛ = TCP) (HOST = MyHost) (PORT = MyPort))) (CONNECT_DATA = (SERVER = ПОСВЯЩЕННЫЙ) (SERVICE_NAME = MyOracleSID))) * * 1004

И у меня это в String. Каков наилучший способ вернуть "MyHost". Также было бы неплохо, если бы это работало для строк двойного соединения, например:

((Data Источник = (ОПИСАНИЕ = (ADDRESS_LIST = (АДРЕС = (ПРОТОКОЛ = TCP) (HOST = MyHost1) (PORT = MyPort1))) (CONNECT_DATA = (SERVER = ПОСВЯЩЕННЫЙ) (SERVICE_NAME = MyOracleSID1)))) (Данные Источник = (ОПИСАНИЕ = (ADDRESS_LIST = (АДРЕС = (ПРОТОКОЛ = TCP) (HOST = MyHost2) (PORT = MyPort2))) (CONNECT_DATA = (SERVER = ПОСВЯЩЕННЫЙ) (SERVICE_NAME = MyOracleSID2)))))

Возвращает «MyHost1» и «MyHost2».

Попытка написать метод, который принимает строку подключения и выплевывает хост / хосты в список строк массива.

Ответы [ 3 ]

3 голосов
/ 14 марта 2011

Использование такого регулярного выражения должно работать: \(HOST=([^)]+)\).

Не забудьте удвоить обратную косую черту в Java String литералы:

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

Создать Matcher из этого Patttern и вашей входной строки, используя matcher() и вызывайте find(), пока она не вернет false.Используйте group(1) для получения имен хостов:

Matcher m = hostPattern.matcher(input);
while (m.find()) {
  System.out.println(m.group(1));
}
1 голос
/ 14 марта 2011

Расширение идеи Йоахима (и я давно не использовал ArrayLists, так что это может быть не совсем правильно):

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 голосов
/ 14 марта 2011

Регулярное выражение \ (HOST = (. *?) \) Будет соответствовать разделу "(HOST = MyHost1)" и "(HOST = MyHost2)" как две группы, содержащие "MyHost1" и "MyHost2" соответственно.

Приветствия,

Ed

...