![]() |
|
Модераторы: ginnie |
![]()
|
|
| reekoff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.12.2011 Репутация: нет Всего: нет |
Здравствуйте!
Имею затык с выражением:
Помогите понять, что к чему, ибо результат работы выражения (совпадение с /xab/xcdx/) имеет расхождение с моими представлениями о его работе. Я думал, оно должно работать так: '/x' совпадает с '/x' в начале. Затем вход в конструкцию выбора, где есть 2 альтернативы - один символ 'не /' в первой и 2 символа ('не x' и '/') во второй. Первая альтернатива совпадает с 'a' - есть совпадение одного 'не /', попытка выхода их конструкции выбора, но максимальный квантификатор заставляет поиск вернуться и искать дальше с позиции после совпадения. Таким образом, первая альтернатива совпадает с 'b' - опять попытка выхода и по квантификатору обратно на позицию перед '/'. Теперь '^/' не совпадает с '/', переход на вторую альтернативу, где ожидается совпадение двух символов - '/' совпадает с '^x', но 'x' в строке не совпадает с '/' в регэкспе. То бишь, здесь имеем несовпадение обеих альтернатив в позиции перед '/x'. Но, так как, квантифицированная конструкция совпала уже с 'ab' и для совпадения этого достаточно, то происходит выход из нее и наступает потребность совпасть с заключительными 'x/'. Происходят возвраты, смены позиции поиска и результирующее совпадение с /xcdx/. Как видно, я не прав! И не понимаю как выражение совпадает с '/x' в середине? Я так мыслю, что вторая альтернатива при этом должна совпадать с 'b/' а первая с 'x', но как это происходит, не могу осилить. Без ломки моих представлений о работе конструкции (|)*, видимо, не обойтись. Помогите разобраться! Спасибо, заранее! |
|||
|
||||
| alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 11 Всего: 14 |
Много букв, тяжело осилить
строка /xab/xcdx/ : 1. /x - совпало с /x 2. a - совпало с [^/] 3. b/ - сразу b совпало с [^/], но затем пара /x несовпала с [^x]/, ну и т.д., из того что вы написали я думаю понятно что произошел возврат и в результате совпадение с [^x]/ 4. x, c и d - совпало с [^/], да, x тут совпало. 5. x/ - после еще одного возврата совпало с x/ |
|||
|
||||
| reekoff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.12.2011 Репутация: нет Всего: нет |
Угу. сначала / не совпадает с первой альтернативой, переход на вторую и несовпадение /x с [^x]/. обе альтернативы не совпали в позиции перед /x. есть уже совпадение с ab. обе альтернативы не квантифицированы по отдельности. внутри конструкции выбора не должно, вроде как, быть возвратов. они должны быть только по выходе из нее, когда для оконечных x/ нужно искать совпадение???
что дальше делает механизм? куда происходят возвраты? то бишь, получается что не совпав в данной позиции, механизм делает возврат до нее, забирает b и вновь пробует совпасть со второй альтернативой??? почему не с первой? сумбур в голове... В общем, мне не понятно, опять же, как произошло совпадение с срединным /x. Если можно, пошагово по пункту 3 |
|||
|
||||
| alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 11 Всего: 14 |
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 |
|||
|
||||
| reekoff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.12.2011 Репутация: нет Всего: нет |
почему сразу проверяется условие [^x]/? ведь [^/] в данном проходе не проверялась? обе альтернативы проверялись (и не совпали) в предыдущем пункте... |
|||
|
||||
| alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 11 Всего: 14 |
||||
|
||||
| reekoff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.12.2011 Репутация: нет Всего: нет |
спасибо!
|
|||
|
||||
| reekoff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.12.2011 Репутация: нет Всего: нет |
alezzz, еще вопрос, навеянный вышеобсудженным:
Это выражение не совпадает - не находится заключительная кавычка. Почему здесь, при совпадении конструкции выбора до конца строки при возврате не совпадает кавычка в строке с кавычкой в выражении? Спасибо! |
|||
|
||||
| alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 11 Всего: 14 |
я непойму чего вы пытаетесь добиться этой регуляркой.
|
|||
|
||||
| reekoff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.12.2011 Репутация: нет Всего: нет |
Да ничего
пример чисто теоретический. просто бывает такое - не дает покоя незнание и все тут ... |
|||
|
||||
| alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 11 Всего: 14 |
в данном случае регулярка составлена так, что со строкой в $var она не совпадет, добиться чтоб совпала можно разными способами, но нужно все-же решить к чему стремиться
|
|||
|
||||
| reekoff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.12.2011 Репутация: нет Всего: нет |
да мне не понятно почему, при возврате, в данном случае, кавычка не совпадает с кавычкой.
не понятно как в здесь возвраты работают. |
|||
|
||||
| reekoff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.12.2011 Репутация: нет Всего: нет |
Хочу выяснить, почему не совпадает это выражение. (Добавил '+' ко второй альтернативе, чтобы меньше писать Я так понимаю: 'a' не совпадает с первой альтернативой, переход на вторую и совпадение последовательно c abc 2. Далее идет \ (символ с которым вторая альтернатива не может совпасть). Но, так как есть совпадение, то происходит выход из конструкции выбора, и, так как строка не закончена, то '*' возвращает поиск обратно в конструкцию выбора на первую альтернативу для дальнейшей работы. Первая совпадает с \", выход и обратно по '*' на поиск дальше в строке. Первая альтернатива не совпадает с 'x', переход на вторую, которая совпадает с 'x3'. Затем первая совпадает с \". Окончательный выход из конструкции выбора - максимальный '*' взял все что мог до конца строки. Но в регэкспе осталась несовпавшей кавычка. И если сделать один возврат, то как раз можно совпасть с кавычкой от \"??? Но этого не происходит. Данное выражение не совпадает с данной строкой. Очевидно, что алгоритм другой при возврате в конструкцию выбора. Очень хочу понять как дальше работает выражение. Просвятите, кто знает! |
|||
|
||||
| alezzz |
|
||||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 11 Всего: 14 |
один возврат, но не на один символ, а сразу на два (\"). вот пример попроще:
естественно, регекс не совпадает если хотите глубже изучить механизм регулярок то use re 'debug' вам в помощь |
||||
|
|||||
| reekoff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 23.12.2011 Репутация: нет Всего: нет |
то бишь, альтернатива совпала сразу с \" за раз и возвращаться будет слитно \"? |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Регулярные выражения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |