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

shark_255

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

вот такая рега :
PHP:
preg_replace('/\(.{30,}?\)/si','',$title);
съедает все что после 30-и символов до конца

как указать, брать больше 30-ти до закрывающей скобки ?
 

Gas

может по одной?
А приведи исходную строку и что должно получиться, только вместо 30 пусть будет 5 символов. Не совсем понятно что нужно.
 

baev

‹°°¬•
Команда форума
Насколько я понял, у тредстартера в строке фигурная скобка.
 

zerkms

TDD infected
Команда форума
baev
в названии треда да, фигурная, а вот в регулярке из стартового поста - обычная %)
 

whirlwind

TDD infected, paranoid
shark_255 у тебя подряд два ограничителя на квантификатор. Сделай из двух шаблонов как то так

.{30}.*?\)
 

Доктор

Новичок
Если подразумевается, что внутри этих 30-ти первых может быть скобка, то странная задача
 

shark_255

Новичок
исходная строка

HP Mini 5101 (NN368EA) (Atom N280 1660 Mhz/10.1"/1024x600/1024Mb/160.0Gb/DVD нет/Wi-Fi/Bluetooth/WinXP Home)

Я так понял, что ограничение жадности, в случае с фигурными скобками, до определенного символа не работает, то есть нужно использовать обыкновенную форму .+? к примеру
 

MiksIr

miksir@home:~$
Ограничение жадности работает
Код:
re> /\((.{2,}?)\)/si
data> (12345)1234)
 0: (12345)
 1: 12345

  re> /\((.{2,})\)/si
data> (12345)1234)
 0: (12345)1234)
 1: 12345)1234
Мне кажется, вы где-то что-то просто неверно понимаете в этом выражении.
 

Gas

может по одной?
(NN368EA) должно ж остаться?
PHP:
preg_replace('~\([^)]{30,}\)~si','', $title);
 

shark_255

Новичок
2MiksIr а вы возьмите мою регу с топик старта и на эту строку натравите

HP Mini 5101 (NN368EA) (Atom N280 1660 Mhz/10.1"/1024x600/1024Mb/160.0Gb/DVD нет/Wi-Fi/Bluetooth/WinXP Home)

что выйдет ?

-~{}~ 27.05.10 15:30:

2Gas такой вариант пойдет. Ну какбе вопрос именно о жадности и фигурных скобках
 

MiksIr

miksir@home:~$
shark_255, вопрос не в жадности, а, повторюсь, в непонимании того, как что работает. Жадность работает, т.е. жадный в такой строке
HP Mini 5101 (NN368EA) (Atom N280 1660 Mhz/10.1"/1024x600/1024Mb/160.0Gb/DVD нет/Wi-Fi/Bluetooth/WinXP Home) (фигня)
вырезал бы все, а с ограничением жадности - "фигня" осталась бы. Что бы понять почему - достаточно словами пересказать что же делает регулярка.
Вариант Gas-а вполне рабочий при условии, что внутри (Atom ... ) не встретится еще скобок.
 

shark_255

Новичок
вопрос не в жадности, а, повторюсь, в непонимании того, как что работает.
у меня конкретный тогда вопрос в этом случае - {30,}? знак вопроса сработает как ограничитель жадности ?
 

whirlwind

TDD infected, paranoid
shark_255 ты квантифицируешь шаблон который уже квантифицирован. Вопрос после {xxx} означает - предыдущее выражением может быть, а может и не быть. Так как у тебя предыдущий шаблон не ограничен, то он и сжирает все подряд. Твой регэксп сработает даже на строке из 1 символа, потому что {30,} может отсутствовать - ты сам это указал знаком ?. То есть первой частью ты требуешь {30,}, а знаком ? это требование отменяешь.

-~{}~ 27.05.10 18:02:

PS. ? - это не квантификатор. Квантификатор это *, +, {XXX}. А ? - это ограничитель квантификатора.
 

MiksIr

miksir@home:~$
Да, я же приводил пример. Сработает. Но жадность регулирует лишь какое совпадение будет взято - самое длинное, или самое короткое. Модификатор жадности не может "сдвинуть" левую границу совпадения.
Вы своей регуляркой что написали? "Скобка - потом 30 и больше любых символов - скобка". Жадность тут влияет только на длину этих "и больше". В итоге смотрите на свой пример - скобка самая первая... потом 30 символов (ну и что, что в эти 30 символов попадают еще скобки - мы это не запрещали), а потом еще сколько-то символов до закрывающей скобки... в итоге все и вырезается. А Gas вместо "любые символы" поставил "любые, но не скобка" - вот тут уже первая скобка не попадает, ибо потом должно быть 30 "не скобок" - а там они есть, и поиск совпадения сдвигается вправо к следующей скобке.

-~{}~ 27.05.10 18:05:

whirlwind, ты эта... не позорься ;) Вопросительны знак после квантификатора означает модификатор "жадности".
 

whirlwind

TDD infected, paranoid
MiksIr :confused:, а я что сказал? ТЫ хоть попробовал проверить, то что я сказал?
 

MiksIr

miksir@home:~$
Ты сказал "Вопрос после {xxx} означает - предыдущее выражением может быть, а может и не быть". "Жадность" означает нечто иное. В доке по регекспам в перле даже приведены были расшифровки специально. Ща найду...

-~{}~ 27.05.10 18:12:

{n} Match exactly n times
{n,} Match at least n times
...

If you want it to match the minimum number of times possible, follow the quantifier with a "?". Note that the meanings don't change, just the "greediness":
...
{n}? Match exactly n times
{n,}? Match at least n times
 

whirlwind

TDD infected, paranoid
блин

PHP:
$title = "";
var_dump(preg_match('/(.{30,})?/',$title));
$title = "123123123112312312311231231231?";
var_dump(preg_match('/.{30,}?/',$title));
$title = "";
var_dump(preg_match('/(.{30,})?/',$title));
$title = "098765432109876543210987654321)";
var_dump(preg_match('/(.{30,})?/',$title));
$title = "098765432109876543210987654321asdasdasdasd)asdasdasdasdasd";
var_dump(preg_match('/(.{30,})?/',$title));

int(1)
int(1)
int(1)
int(1)
int(1)
так как {} не требует ограничения, ? сразу после рассматривается как следующий шаблон. Отдельный ? после любого шаблона указывает на необязательность шаблона. Просто в таком виде как у ТС он не был так рассмотрен. Зная задачу, определенно это - неверно составленный регэксп, о чем я и сказал.

ЗЫ. что бы сделать ограничение жадности на .{30,}, надо его выразить в виде шаблона. А без скобок это не шаблон, а квантифицированные данные.
 

MiksIr

miksir@home:~$
Это тебя TDD научило такие бестолковые тесты писать? Что вообще ими показать то хотел?

Напрягись чуток, пролистай вверх - найди мое сообщение с тестом. Там как раз ? после {} и демонстрация, как он влияет на результат.

А "зная задачу" проблема у топикстартера сооовсем в другом, а не в том, что он хотел "необязательность".
 

whirlwind

TDD infected, paranoid
Спорить не буду, копипастить инфу из мануала гораздо проще, чем объяснить эту тему своими словами. Вот другой пример

PHP:
$title = "2";
var_dump(preg_match('/^A?\d$/', $title, $matches));
print_r($matches);
Вот если тут понять почему $title соответствует, то станет ясно, что по сути ? не ограничивает жадность, а позволяет КА продолжать работу [зачеркнуто]даже если совпадений не найдено[/зачеркнуто] независимо от совпадений, а "ограничение жадности" это побочный эффект.
 
Сверху