Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.29;
Скачать: CL | DM;

Вниз

Регулярные выражения   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
4-1171380174
niko_
2007-02-13 18:22
2007.07.29
Блокировка кнопок WIN и Alt+Tab


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


2-1183450957
ChaoX
2007-07-03 12:22
2007.07.29
Как напечатать из Paintbox?


2-1183383561
авыф
2007-07-02 17:39
2007.07.29
MS SQL 2005


2-1183588368
snowkam
2007-07-05 02:32
2007.07.29
OpenDialog