Russian Qt Forum

Qt => Общие вопросы => Тема начата: neosapient от Октябрь 22, 2009, 14:48



Название: QRegExp, помогите написать регулярное выражение для трассировки строк
Отправлено: 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-адрес, а квадратные скобки на пишутся.
Помогите написать такое регулярное выражение  ???


Название: Re: QRegExp, помогите написать регулярное выражение для трассировки строк
Отправлено: ildar от Октябрь 23, 2009, 13:38
для части строки "yandex-ic-130313-mow-b1.c.telia.net [213.248.96.34]"
должно сработать что-то типа такого регекспа

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

[^\\[] - любой символ кроме открывающей квадратной скобки
[^\\]] - * закрывающей *


Название: Re: QRegExp, помогите написать регулярное выражение для трассировки строк
Отправлено: zenden от Октябрь 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);
 
 


Название: Re: QRegExp, помогите написать регулярное выражение для трассировки строк
Отправлено: neosapient от Октябрь 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;

Где можно прочитать про правила составления регулярных выражений. По справке разобраться не удалось, может есть хороший учебник, где всё разжеванно?


Название: Re: QRegExp, помогите написать регулярное выражение для трассировки строк
Отправлено: Khs от Октябрь 23, 2009, 19:02
"Дж. Фридл. Регулярные выражения"


Название: Re: QRegExp, помогите написать регулярное выражение для трассировки строк
Отправлено: ildar от Октябрь 23, 2009, 19:43
зачем знак вопроса ?

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

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

кроме того надо учесть жадность, "(?:[a-z][a-z\\.\\d\\-]+)\\." - точка будет внутри скобки вроде бы


Название: Re: QRegExp, помогите написать регулярное выражение для трассировки строк
Отправлено: zenden от Октябрь 23, 2009, 21:14
neosapient
А чем мой вариант не устраивает? Рабочий он

Одновременно оба варианта парсит.