Модераторы: ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не понятна работа выражения 
:(
    Опции темы
reekoff
Дата 3.4.2012, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.12.2011

Репутация: нет
Всего: нет



Здравствуйте!
Имею затык с выражением:

Код

my  $var = '/xab/xcdx/';
if ($var =~ m{(/x([^/]|[^x]/)*x/)}) { print "[$1]\n" };


Помогите понять, что к чему, ибо результат работы выражения (совпадение с /xab/xcdx/) имеет расхождение с моими представлениями о его работе.
Я думал, оно должно работать так:

'/x' совпадает с '/x' в начале. Затем вход в конструкцию выбора, где есть 2 альтернативы - один символ 'не /' в первой и 2 символа ('не x' и '/') во второй. Первая альтернатива совпадает с 'a' - есть совпадение одного 'не /', попытка выхода их конструкции выбора, но максимальный квантификатор заставляет поиск вернуться и искать дальше с позиции после совпадения. Таким образом, первая альтернатива совпадает с 'b' - опять попытка выхода и по квантификатору обратно на позицию перед '/'. Теперь  '^/' не совпадает с '/', переход на вторую альтернативу, где ожидается совпадение двух символов - '/' совпадает с '^x', но 'x' в строке не совпадает с '/' в регэкспе. То бишь, здесь имеем несовпадение обеих альтернатив  в позиции перед '/x'. 
Но, так как, квантифицированная конструкция совпала уже с 'ab' и для совпадения этого достаточно, то происходит выход из нее и наступает потребность совпасть с заключительными 'x/'. Происходят возвраты, смены позиции поиска и результирующее совпадение с /xcdx/. 
Как видно, я не прав! И не понимаю как выражение совпадает с '/x' в середине? Я так мыслю, что вторая альтернатива при этом должна совпадать с 'b/' а первая с 'x', но как это происходит, не могу осилить. Без ломки моих представлений о работе конструкции (|)*, видимо, не обойтись.
Помогите разобраться!
Спасибо, заранее!
PM MAIL   Вверх
alezzz
Дата 3.4.2012, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 11
Всего: 14



Много букв, тяжело осилить smile, давайте по прядку:
строка /xab/xcdx/ :
1. /x - совпало с /x
2. a - совпало с [^/]
3. b/ - сразу b совпало с [^/], но затем пара /x несовпала с [^x]/,  ну и т.д., из того что вы написали я думаю понятно что произошел возврат и в результате совпадение с [^x]/
4. x, c и d - совпало с [^/], да, x тут совпало.
5. x/ - после еще одного возврата совпало с x/
PM MAIL   Вверх
reekoff
Дата 3.4.2012, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.12.2011

Репутация: нет
Всего: нет



Угу.  сначала / не совпадает с первой альтернативой, переход на вторую и несовпадение /x с [^x]/. обе альтернативы не совпали в позиции перед /x. есть уже совпадение с ab. обе альтернативы не квантифицированы по отдельности. внутри конструкции выбора не должно, вроде как, быть возвратов. они должны быть только по выходе из нее, когда для оконечных x/  нужно искать совпадение???
 что дальше делает механизм? куда происходят возвраты?
то бишь, получается что не совпав в данной позиции, механизм делает возврат до нее, забирает b  и вновь пробует совпасть со второй альтернативой??? почему не с первой?
сумбур в голове...  smile 
В общем, мне не понятно, опять же, как произошло совпадение с срединным /x.
Если можно, пошагово по пункту 3

PM MAIL   Вверх
alezzz
Дата 3.4.2012, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 11
Всего: 14



Цитата(reekoff @  3.4.2012,  11:44 Найти цитируемый пост)
Если можно, пошагово по пункту 3

1.  ab/x
   ^ - совпало с [^/]
2. a b/x
    ^ - совпало с [^/]
3. ab /x
     ^ - несовпало не с [^/], не с [^x]/, выход из (..|..)*, но т.к. невозможно получить последнее x/, то происходит возврат
4. a b/x
    ^ - тоже невозможно получить x/, но тут сразу проверяется условие [^x]/, т.к. [^/] уже проверили
5. ab/ x
      ^ - совпало с [^/]


Это сообщение отредактировал(а) alezzz - 3.4.2012, 12:02
PM MAIL   Вверх
reekoff
Дата 3.4.2012, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.12.2011

Репутация: нет
Всего: нет



Цитата(alezzz @ 3.4.2012,  12:00)


4. a b/x
    ^ - тоже невозможно получить x/, но тут сразу проверяется условие [^x]/, т.к. [^/] уже проверили


почему сразу проверяется условие [^x]/? ведь [^/] в данном проходе не проверялась? обе альтернативы проверялись (и не совпали) в предыдущем пункте...
PM MAIL   Вверх
alezzz
Дата 3.4.2012, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 11
Всего: 14



Цитата(reekoff @  3.4.2012,  12:44 Найти цитируемый пост)
почему сразу проверяется условие [^x]/? ведь [^/] в данном проходе не проверялась?

проверялось на шаге 2
PM MAIL   Вверх
reekoff
Дата 3.4.2012, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.12.2011

Репутация: нет
Всего: нет



спасибо!

PM MAIL   Вверх
reekoff
Дата 3.4.2012, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.12.2011

Репутация: нет
Всего: нет



alezzz, еще вопрос, навеянный вышеобсудженным:

Код

$var = '"abc 2\"x3\"';
if ($var =~ /("(\\.|[^"\\])*")/) { print "$1\n" };


Это выражение не совпадает - не находится заключительная кавычка. 
Почему здесь, при совпадении конструкции выбора до конца строки при возврате не совпадает кавычка в строке с кавычкой в выражении?
Спасибо!
PM MAIL   Вверх
alezzz
Дата 3.4.2012, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 11
Всего: 14



я непойму чего вы пытаетесь добиться этой регуляркой.

PM MAIL   Вверх
reekoff
Дата 3.4.2012, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.12.2011

Репутация: нет
Всего: нет



Да ничего  smile 
пример чисто теоретический.
просто бывает такое - не дает покоя незнание и все тут ...
PM MAIL   Вверх
alezzz
Дата 3.4.2012, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 11
Всего: 14



в данном случае регулярка составлена так, что со строкой в $var она не совпадет, добиться чтоб совпала можно разными способами, но нужно все-же решить к чему стремиться
PM MAIL   Вверх
reekoff
Дата 3.4.2012, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.12.2011

Репутация: нет
Всего: нет



да мне не понятно почему, при возврате, в данном случае, кавычка не совпадает с кавычкой.
не понятно как в здесь возвраты работают.
PM MAIL   Вверх
reekoff
Дата 8.4.2012, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.12.2011

Репутация: нет
Всего: нет



Код

$var = '"abc 2\"x3\"';
if ($var =~ /("(\\.|[^"\\]+)*")/) { print "$1\n" };


Хочу выяснить, почему не совпадает это выражение.  (Добавил '+' ко второй альтернативе, чтобы меньше писать  smile )
Я так понимаю:
'a' не совпадает с первой альтернативой, переход на вторую и совпадение последовательно c abc 2. Далее идет \ (символ с которым вторая альтернатива
 не может совпасть). Но, так как есть совпадение, то происходит выход из конструкции выбора, и, так как строка не закончена, то '*' возвращает поиск
обратно в конструкцию выбора на первую альтернативу для дальнейшей работы. Первая совпадает с \", выход и обратно по '*' на поиск дальше в строке.
Первая альтернатива не совпадает с 'x', переход на вторую, которая совпадает с 'x3'. Затем первая совпадает с \". Окончательный выход из
конструкции выбора - максимальный '*' взял все что мог до конца строки. Но в регэкспе осталась несовпавшей кавычка. И если сделать один возврат, то
как раз можно совпасть с кавычкой от \"??? Но этого не происходит. Данное выражение не совпадает с данной строкой. Очевидно, что алгоритм другой
при возврате в конструкцию выбора. Очень хочу понять как дальше работает выражение. 
Просвятите, кто знает!
PM MAIL   Вверх
alezzz
Дата 8.4.2012, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 11
Всего: 14



Цитата(reekoff @  8.4.2012,  19:25 Найти цитируемый пост)
 И если сделать один возврат, токак раз можно совпасть с кавычкой от \"??? Но этого не происходит. 

один возврат, но не на один символ, а сразу на два (\").

вот пример попроще:
Код

print 1 if 'abcabcabc' =~ /^(abc)*c$/;

естественно, регекс не совпадает

если хотите глубже изучить механизм регулярок то use re 'debug' вам в помощь smile
PM MAIL   Вверх
reekoff
Дата 8.4.2012, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 23.12.2011

Репутация: нет
Всего: нет



Цитата

один возврат, но не на один символ, а сразу на два (\").

 то бишь, альтернатива совпала сразу с \" за раз  и возвращаться будет слитно \"?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.