как быть с жадностью в случае с фигурными скобками

shark_255

Новичок
2MiksIr

предлагаю для вашей реги такой тест (1)(1234)
и объяснить почему 1234 не попало в предполагаемый результат
 

MiksIr

miksir@home:~$
Вот если тут понять почему $title соответствует, то станет ясно, что по сути ? не ограничивает жадность, а позволяет КА продолжать работу [зачеркнуто]даже если совпадений не найдено[/зачеркнуто] независимо от совпадений, а "ограничение жадности" это побочный эффект.
Иногда лучше уж мануал процитировать, чем своими словами. Иначе создается впечатление, что вы утверждаете, что preg_match("/A\d{5,}?B/", "AB") будет истина.

-~{}~ 27.05.10 20:45:

shark_255, для какой именно?
 

MiksIr

miksir@home:~$
Код:
 re> /\((.{2,}?)\)/si
data> (1)(1234)
 0: (1)(1234)
 1: 1)(1234
Не смогу объяснить... потому что оно попало.
 

whirlwind

TDD infected, paranoid
MiksIr перечитал, согласен. Я хотел акцентировать внимание на области применения ?. То что он записывается после {XXX} не означает, что он относится к квантификатору - он относится к шаблону. Просто иной синтаксис невозможен, потому что тогда квантификатор будет относиться к неопределенному шаблону.
 

shark_255

Новичок
да и давайте на этом закончим.

Не смогу объяснить... потому что оно попало.
вы сами все поняли поэтому раздувать дальше не вижу смысла

хотя так для всеобщего просветления уточню, что требуется от реги - найти скобку за которой больше двух символов до закрывающей скобки.
 

MiksIr

miksir@home:~$
вы сами все поняли поэтому раздувать дальше не вижу смысла
О, спасибо. Меня во что-то ткнули и чему-то научили. Теперь спать не буду, что бы понять - во что и чему ))))))))

То что он записывается после {XXX} не означает, что он относится к квантификатору - он относится к шаблону. Просто иной синтаксис невозможен, потому что тогда квантификатор будет относиться к неопределенному шаблону.
Если честно, я все-равно не понял, что вы хотите сказать =) В мануале четко и ясно написано - есть квантификаторы (блин, как это по-русски то), квантифицированные подшаблоны - жадные, если хотите убрать жадность - поставьте после квантификатора знак вопроса. Т.е. что бы не было непоняток, знак вопроса после квантификатора нужно рассматривать как дополнительная опция квантификатора и никак иначе. Бррр =)

-~{}~ 27.05.10 21:16:

хотя так для всеобщего просветления уточню, что требуется от реги - найти скобку за которой больше двух символов до закрывающей скобки.
Я не собирался вам давать решение, я всего-лишь объяснял вам как _ваш_ патерн работает и почему он делает не то, что вы хотите. Ответив так же на вопрос - работает ли ограничитель жадности после фигурных скобок на примере. А готовое решение вам Gas дал, хотя могли бы и сами додуматься, если бы поняли как ваш патерн работает.
 

whirlwind

TDD infected, paranoid
Это дополнительная опция _любого_ шаблона. Квантифицированный шаблон это такой же шаблон как и все, только дополнительным условием является true квантификатора. Вот как только квантификатор становится true, то срабатывает ? для шаблона.
 

MiksIr

miksir@home:~$
Ну нееее... как это любого шаблона. Вопросительный знак после _шаблона_ - это квантификатор - 0 или 1, вопросительный знак после квантификатора - это опция этого квантификатора. Ну совсем разные смыслы, не понимаю зачем вы хотите их к одному знаменателю привести.
 

whirlwind

TDD infected, paranoid
Вот для этого я приводил примеры в круглых скобках. Шаблон чем определяется?

1. символ/метасимвол
2. класс символов
3. подшаблон определенный внутри ()

После любых этих конструкций может быть квантификатор + ? либо только ?
 

MiksIr

miksir@home:~$
Иии...? =)
Вопросительный знак после скобок - это квантификатор, так как он стоит после _шаблона_. Вопросительный знак после фигурных скобок - опция, так как стоит после квантификатора. Все в точности как я сказал постом выше =)
Ну т.е. может чисто терминологически поспорить - вопросительный знак после квантификатора - это опция квантификатора или же опция квантифицированного шаблона, но это уже, имхо, риторика =)) Но вопросительный знак после шаблона - это всегда квантификатор, его уж опцией никак не назовешь.
 

whirlwind

TDD infected, paranoid
Мы же не терминологией занимаемся, мы же хотим понять как это работает, верно? ;) А для этого представляем конечный автомат и действие, которое происходит в момент обработки ?. А происходит в зависимости от реализации либо ветвление, либо ставится точка возврата. И квантификатор и ? относятся к шаблону, они не могут существовать без шаблона, но могут существовать друг без друга.
 

MiksIr

miksir@home:~$
? как "опция квантификатора" не может существовать без онного. Ибо без квантификатора это уже будет совсем другая ?, нести совсем другой смысл, другую логику и обрабатываться другим участком кода. И, к примеру, ? стоящая после скобки не может существовать без этой скобки, ибо будет нести совсем иной смысл.
Не, может я не понимаю какого-то глубинного философского смысла, но идти читать исходники pcre как-то совершенно не хочется.

-~{}~ 27.05.10 21:52:

PS: без терминологии понять как работает - нельзя. пруф: точные науки =) Вернее можно, но в пределах объятного одним мозгом, и объяснить никому ничего уже не получится.
 

whirlwind

TDD infected, paranoid
? сразу после шаблона - это шаблон с пустым квантификатором, если угодно. Считайте что квантификатор - это повторитель, а ? - это ветвление.

ЗЫ. и собсна почему жадность ограничивается? Фактически, поиск завершается в той ветке, которая была начата раньше. По этому и "нежадный".
 

MiksIr

miksir@home:~$
Не готов обсуждать это с точки зрения реализации. Насколько я знаю, флаг жадности рассматривается отдельно и является флагом приоритета - в каком порядке рассматривать ветки, но в теории автоматов не настолько силен, что бы продолжать эту дискуссию. А самое главное - она тут смысла не имеет, ибо речь идет о другом.
 
Сверху