Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по регулярным выражениям

1.8K
08 июня 2009 года
igor_nf
256 / / 13.12.2006
Есть некая строка. Мне нужно при помощи регулярного выражения проанализировать её определённую подстроку. Пример строки:

my.domain.tld:[172.16.7.15]

Возможно ли в принципе при помощи регекса проанализировать на соответствие паттерну только, например, имя хоста? Мне нужно, например, анализировать имя хоста на встречающиеся цифры в имени ну и т.п.

P.S. Не надо мне говорить, что это подход через задний проход - легче применить функцию типа substr_xxx.. и далее уже использовать регулярку. Я не пишу программу и ограничен в использовании только регулярными выражениями. Заранее спасибо.

P.P.S Была мысль, что нужен ленивый движок, но все движки, которые мне встречались в реальной жизни (perl, posix basic/extended) пытаются найти максимальное соответствие. Буду благодарен рациональным мыслям, наводкам, подсказкам, соображениям.. Ещё раз заранее спасибо.
2
08 июня 2009 года
squirL
5.6K / / 13.08.2003
Цитата: igor_nf
Есть некая строка. Мне нужно при помощи регулярного выражения проанализировать её определённую подстроку. Пример строки:

my.domain.tld:[172.16.7.15]

Возможно ли в принципе при помощи регекса проанализировать на соответствие паттерну только, например, имя хоста? Мне нужно, например, анализировать имя хоста на встречающиеся цифры в имени ну и т.п.

P.S. Не надо мне говорить, что это подход через задний проход - легче применить функцию типа substr_xxx.. и далее уже использовать регулярку. Я не пишу программу и ограничен в использовании только регулярными выражениями. Заранее спасибо.

P.P.S Была мысль, что нужен ленивый движок, но все движки, которые мне встречались в реальной жизни (perl, posix basic/extended) пытаются найти максимальное соответствие. Буду благодарен рациональным мыслям, наводкам, подсказкам, соображениям.. Ещё раз заранее спасибо.



еще раз и медленно. что нужно сделать? из приведенной строки анализировать только то, что до :, а остальное игнорировать?

1.8K
08 июня 2009 года
igor_nf
256 / / 13.12.2006
Цитата: squirL
еще раз и медленно. что нужно сделать? из приведенной строки анализировать только то, что до :, а остальное игнорировать?



Да, именно так

2
08 июня 2009 года
squirL
5.6K / / 13.08.2003
варианты:
первый - это просто выполнять составить шаблон по разделителю: ^"анализирующий шаблон"[COLOR="Red"]:[/COLOR].*$
второй - вырезать при помощи регулярки интересующий шаблон, а затем обрабатывать как самостоятельный образец. в perl, например, это реализуется сохраняющими круглыми скобками: блабла("искомый_шаблон")блабла - все что в скобках - сохраняется в специальную переменную.

ну и еще
Цитата:

все движки, которые мне встречались в реальной жизни (perl, posix basic/extended) пытаются найти максимальное соответствие


ты упустил из виду, что все движки поддерживают ограничение жадности квантификаторов

341
08 июня 2009 года
Der Meister
874 / / 21.12.2007
 
Код:
^(?<hostname>.+):\[(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3})\]$
Выделяем в именованные группы имя хоста и айпишник. Далее получаем значение группы hostname, например так (ре-бемоль):
 
Код:
// в образец добавлена директива, включающая мультилайн
const string pattern =
    @"(?m-isx:^\s*(?<hostname>.+)\s*:\s*\[(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]\s*$)";
Regex regex = new Regex(pattern);

const string sampleString = "my.domain.tld:[172.16.7.15]\nforum.codenet.ru:[154.0.1.245]";

foreach (Match match in regex.Matches(sampleString))
    Console.WriteLine(match.Groups["hostname"].Value);
Пожалуй, любая реализация регулярок предусматривает получение значений для групп.
1.8K
08 июня 2009 года
igor_nf
256 / / 13.12.2006
Вот так всегда. Изучив материал в течении пары дней - думаю, что мне достаточно и я всё знаю в данном вопросе. Оказывается - нет.
[quote=Squirl]
ты упустил из виду, что все движки поддерживают ограничение жадности квантификаторов
[/quote]
Не нашёл, честно говоря - как, например, тот же grep заставить быть ленивым. Видимо, опять же, посмотрев man по диагонали за 3 минуты, решил, что нет возможности :).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог