Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1183376845
wesaaaa
2007-07-02 15:47
2007.07.29
Какая есть компонент-кнопка


2-1183368943
Tonich
2007-07-02 13:35
2007.07.29
COM-порт


2-1183492895
TStas
2007-07-04 00:01
2007.07.29
Почему у TString property Objects, а нет Pointers?


11-1166629512
DenisY
2006-12-20 18:45
2007.07.29
передать данные в PHP


2-1183355919
Alex8
2007-07-02 09:58
2007.07.29
Изменение редактора полей в RunTime





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский