Форум: "Прочее";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];
ВнизРегулярные выражения Найти похожие ветки
← →
Piter © (2007-06-29 17:58) [0]Скопились вопросы по данному направлению, не могу понять некоторой логики. Экспериментирую я на примере PHP и функции preg_match (совместима с Perl-синтаксисом)
1) вот например такая строка:"/\[i\](.*?)\[\/i\]/"
Что она означает? Начальный и конечный символ "/"понятно. Зачем перед квадратными скобками стоит: "\" ? Что он экранирует?
Зачем внутри скобок квадратных стоит еще раз: "\" ?
Что означает это "i" внутри квадратных скобок?
2) что означает i в конце строки-шаблона?
Пример: "/<([^>]+)>/i"
Что означает это "/i" ?
3) как исключить не один символ, а группу ПОСЛЕДОВАТЕЛЬНЫХ символов?
Чтобы не встречались некие символы могу написать так: [^ABC]
А если я хочу, чтобы не встречались они именно вместе последовательно. Чтобы не было "ABC", но могло бы быть: "A2B3C"
Пример: нужно вычислить строчку между тегами <p> и </p>, но только если там внутри нету последовательности символов
← →
Piter © (2007-06-29 17:59) [1]сори, движок скушал третий пункт:
3) как исключить не один символ, а группу ПОСЛЕДОВАТЕЛЬНЫХ символов?
Чтобы не встречались некие символы могу написать так: [^ABC]
А если я хочу, чтобы не встречались они именно вместе последовательно. Чтобы не было "ABC", но могло бы быть: "A2B3C"
Пример: нужно вычислить строчку между тегами [p] и [/p], но только если там внутри нету последовательности символов [b]
← →
McSimm © (2007-06-29 18:13) [2]
> Зачем перед квадратными скобками стоит: "\" ? Что он экранирует?
Экранирует квадратные скобки. Это специальные символы в регекспах. Будучи заэеранированным - обычные символы.
> Зачем внутри скобок квадратных стоит еще раз: "\" ?
Экранируют вторую скобку и слэш
> Что означает это "i" внутри квадратных скобок?
символ "i"
> что означает i в конце строки-шаблона
case-insensetive
Все это, а также многое другое, можно найти в документации к тому же PHP? например.
> Чтобы не было "ABC"
можно, например, написать !preg_match (или !~ в Perl)
← →
McSimm © (2007-06-29 18:17) [3]
> сори, движок скушал третий пункт:
Проще всего делать несколько проверок.
Есть еще так называемые обратные ссылки и утверждения, но с ними тоже не все можно решить.
← →
Piter © (2007-06-30 12:32) [4]McSimm © (29.06.07 18:13) [2]
спасибо! А вот в выражении:(.*?)
Какой смысл у знака вопроса? Точа вроде означает любой символ, кроме переноса строки, потом звездочка говорит о том, есть нулевое или больше вхождений. А потом знак вопроса, который также является спец. символов. Но что он определяет, если уже звездочка есть?
McSimm © (29.06.07 18:13) [2]
можно, например, написать !preg_match
да, но это чтобы понять только факт отсутствия. А если мне например нужны ВЫЯВИТЬ строчку, находящуюся между [b] и [/b], но только если там нету [i] внутри.
Как запрос будет выглядеть?
← →
Piter © (2007-06-30 12:35) [5]И еще один побочный вопрос. Есть такая выражение:
preg_match("/^magnet:\?xt=urn:tree:tiger:[A-Z0-9]+&xl=([0-9]+)&dn=\S+$/", $dclink, $match)
Почему оно не срабатывает для строки вида:magnet:?xt=urn:tree:tiger:QIEXWP5J2WC4T7MGGUVC5W4P2S55WZ5FCMVDUWI&xl=75750 &dn=All_musik.m3u
← →
Piter © (2007-06-30 12:40) [6]строчка без пробелов, это движок форума разбил, "75750" и "&dn=All_musik.m3u" слитно идут.
← →
Piter © (2007-06-30 14:12) [7]никто не знает?
← →
Grom PE © (2007-06-30 14:15) [8]> Piter © (30.06.07 14:12) [7]
Я попробовал, срабатывает.
← →
McSimm © (2007-07-01 18:32) [9]
> в выражении: (.*?)
>
> Какой смысл у знака вопроса?
Знак вопрос после квантификаторов выключает жадный режим. Это значит, что поиск завершится с минимальным возможным шаблоном. По умолчанию - с максимальным.
> preg_match("/^magnet:\?xt=urn:tree:tiger:[A-Z0-9]+&xl=([0-
> 9]+)&dn=\S+$/", $dclink, $match)
>
> Почему оно не срабатывает для строки вида:
Срабатывает.
preg_match возвращает 1, $match содержит захваченное.
> Пример: нужно вычислить строчку между тегами [p] и [/p],
> но только если там внутри нету последовательности символов
> [b]
Алгоритмически как-нибудь.
Например захватить все и отсеять неподходящие.
← →
Zeqfreed © (2007-07-01 19:51) [10]Вот ведь. Есть отличные мануалы по регулярным выражениям. Например, http://perldoc.perl.org/perlre.html
← →
Zeqfreed © (2007-07-01 19:56) [11]> 3) как исключить не один символ, а группу ПОСЛЕДОВАТЕЛЬНЫХ
> символов?
Смотри в сторону look-ahead и look-behind шаблонов. По ссылке из [10] они описаны в разделе Extended Patterns.
← →
Piter © (2007-07-01 21:44) [12]McSimm © (01.07.07 18:32) [9]
Это значит, что поиск завершится с минимальным возможным шаблоном. По умолчанию - с максимальным
а можешь пояснить?
← →
MeF Dei Corvi © (2007-07-01 21:53) [13]
> а можешь пояснить?
http://ru2.php.net/manual/ru/reference.pcre.pattern.syntax.php
ИМХО, доходчиво и достаточно ёмко.
Выдержка оттуда по поводу жадности:По умолчанию, все квантификаторы являются "жадными", это означает, что они совпадают максимально возможное количество раз (но не более, чем максимально допустимое количество раз), не приводя к невозможности сопоставления остальных частей шаблона. Классический пример проблем, которые могут возникнуть в связи с такой особенностью квантификаторов - нахождение комментариев в C-программах. Комментарием считается произвольный текст, находящийся внутри символьных комбинаций /* и */ (при этом, символы "/" и "*" также могут быть частью комментария). Попытка найти комментарии при помощи шаблона /\*.*\*/ в строке /* первый комментарий */ не комментарий /* второй комментарий */ закончится неудачей, поскольку указанный шаблон соответствует всей строке целиком (из-за жадности кватификатора "*").
Однако, если сразу же после квантификатора идет вопросительный знак, он перестает быть жадным и соответствует минимально допустимому количеству раз. Таким образом, шаблон /\*.*?\*/ корректно находит все комментарии языка Си. Использование символа "?" после квантификатора влияет исключительно на его жадность, и не затрагивает никакие другие свойства.
← →
db2admin © (2007-07-02 07:25) [14]есть книжка "Mastering regular expression" там описано действительно все.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c