Russian Qt Forum
Октябрь 02, 2024, 09:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QRegExp, помогите написать регулярное выражение для трассировки строк  (Прочитано 7139 раз)
neosapient
Гость
« : Октябрь 22, 2009, 14:48 »

Хочу распарсить получаемые с трассировки зачения.
Цитировать
  1    <1 ms    <1 ms    <1 ms  192.168.1.1
  .........................................................
 13   140 ms   141 ms   140 ms  yandex-ic-130313-mow-b1.c.telia.net [213.248.96.34]
 14   137 ms   138 ms   134 ms  volkswagen-vlan602.yandex.net [77.88.16.122]
 15   137 ms   136 ms   136 ms  yandex.ru [213.180.204.11]

С цифрами в первых четырех столбцах разобрался.
Теперь, интересует как выделить в последнем столбце ip и host-имя. Причем, если host-имя извесно, то ip адрес пишется в квадратных скобках. Если host-имя не извесно, то сраз пишется ip-адрес, а квадратные скобки на пишутся.
Помогите написать такое регулярное выражение  Непонимающий
Записан
ildar
Гость
« Ответ #1 : Октябрь 23, 2009, 13:38 »

для части строки "yandex-ic-130313-mow-b1.c.telia.net [213.248.96.34]"
должно сработать что-то типа такого регекспа

Код:
([^\\[]+(\\[[^\\]]+\\])?)

[^\\[] - любой символ кроме открывающей квадратной скобки
[^\\]] - * закрывающей *
Записан
zenden
Гость
« Ответ #2 : Октябрь 23, 2009, 14:14 »

ildar
зачем знак вопроса ?

мой вариант:

Код
C++ (Qt)
 
QRegExp rx("(([^\\[\\s]*)\\s+\\[)*((\\d{1,3}\\.){3}\\d{1,3})");
 
...
 
Domain = rx.cap(2); // если доменное имя не определилось, строка Domain будет пустой
Ip = rx.cap(3);
 
 
« Последнее редактирование: Октябрь 23, 2009, 14:18 от zenden » Записан
neosapient
Гость
« Ответ #3 : Октябрь 23, 2009, 16:29 »

Воспользовался http://txt2re.com/

IP адресс выделяю через ((?Грустный?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?![\\d])
Код:
	QString str("yandex.ru [2.154.160.255]");
QRegExp rxip("((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?![\\d])");
int pos;
QString ip;
pos = rxip.indexIn(str);
if (pos > -1) {
ip = rxip.cap(1);
qDebug() << rxip.cap(1) << rxip.cap(2);;
}
qDebug() << ip;

Url адресс выделяю через ((?:[a-z][a-z\\.\\d\\-]+)\\.(?:[a-z][a-z\\-]+))(?![\\w\\.])
Код:
	QString str("yandex.ru [2.154.160.255]");
QRegExp rxip("((?:[a-z][a-z\\.\\d\\-]+)\\.(?:[a-z][a-z\\-]+))(?![\\w\\.])");
int pos;
QString ip;
pos = rxip.indexIn(str);
if (pos > -1) {
ip = rxip.cap(1);
qDebug() << rxip.cap(1) << rxip.cap(2);;
}
qDebug() << ip;

Где можно прочитать про правила составления регулярных выражений. По справке разобраться не удалось, может есть хороший учебник, где всё разжеванно?
Записан
Khs
Гость
« Ответ #4 : Октябрь 23, 2009, 19:02 »

"Дж. Фридл. Регулярные выражения"
Записан
ildar
Гость
« Ответ #5 : Октябрь 23, 2009, 19:43 »

зачем знак вопроса ?

ip адреса может не быть, знак вопроса ограничивает количество совпадений, эквивалент {0,1}

2 neosapient
сформулируй условие поиска
я например искал бы для строки "yandex.ru [2.154.160.255]" так :
1. берем все пока не встретим [
2. берем все пока не встретим ]

кроме того надо учесть жадность, "(?:[a-z][a-z\\.\\d\\-]+)\\." - точка будет внутри скобки вроде бы
« Последнее редактирование: Октябрь 23, 2009, 19:53 от ildar » Записан
zenden
Гость
« Ответ #6 : Октябрь 23, 2009, 21:14 »

neosapient
А чем мой вариант не устраивает? Рабочий он

Одновременно оба варианта парсит.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.071 секунд. Запросов: 20.