Регулярка с условием

Dez

Новичок
Скажите, почему не сопоставляет со строкой 'u1':
PHP:
$res = preg_match('/(?(?=\d)u|p)/i', "u1", $matches);
 

riff

Новичок
А почему должно? Не плохо было бы объяснить свою логику.

Давай прочитаем это по-человечески:
( - начинаем захват
? - непонятно зачем стоящий символ

далее или
(?=\d) - справа цифра
u - за ней u

или
p - p

) - конец захвата
 
Последнее редактирование:

freeek

Новичок
А почему должно? Не плохо было бы объяснить свою логику.

Давай прочитаем это по-человечески:
( - начинаем захват
? - непонятно зачем стоящий символ

...
наверное имелось ввиду так:

PHP:
$res = preg_match('/(?:(?=\d)u|p)/i', "u1", $matches);
глупость сказал))

PHP:
$res = preg_match('/(?(?=.*\d)u|p)/i', "u1", $matches);
автору, почитай про "утверждения"
 

Dez

Новичок
да, нет. (? - это условная подмаска

Я смотрю в данной статье объяснение:
Условные подмаски.
По-моему, этого достаточно: (?(condition)yes-pattern|no-pattern)
Пример: (?(?=\d)u|p). (?=\d) - это условие. Мы утверждаем, что после этого места идет цифра. Если оно истинно, то на данном месте должна стоять буква u. Иначе - p.
Но походу тут у них в примере ошибка
 

riff

Новичок
Точнее работает как-то наоборот
PHP:
$res = preg_match('/(?(?=\d)u|p)/', "htt7unbp", $matches); //= p
$res = preg_match('/(?(?!\d)u|p)/', "htt7unbp", $matches); //= u
 

freeek

Новичок
утверждение ничего не захватывает
PHP:
$res = preg_match('/(?(?=\d).u|p)/', "htt7unbp", $matches); //= 7u
мы говорим, что смотрим с того места где мы ожидаем цифру, но при этом указываем, что сразу идет символ. а куда делась цифра? поэтому условие не срабатывает и мы получаем p.

во втором случае, у нас просто условие, что мы смотрим с того места где нет цифры и логично, что нам выпадает u.
 

riff

Новичок
мы говорим, что смотрим с того места где мы ожидаем цифру, но при этом указываем, что сразу идет символ. а куда делась цифра?
Вот, теперь всё встало на свои места. Спасибо.

Тогда выражение превращается в:
PHP:
$res = preg_match('/(?(?<=\d)u|p)/', "htt7unbp", $matches); //= u
если учесть , что нам семёрка в результатах не нужна (или нужна?).

upd: тьфу, у ТС не семёрка, а единица, и не перед, а после "u".
upd:
PHP:
$res = preg_match('/(?(?=.\d)u|p)/', "httu1nbp", $matches); //= u
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Из предложенной автором регулярки (которая, как уже выяснили, НИКОГДА не совпадёт с "u") неясно, что ему надо ловить в "u1".
"u"? "u1"? Если отбросить заведомо нереальные конструкции, то, видимо, всё-таки "u".
Тогда либо "(u(?=\d)|p)" либо как-то близко к этому.
Начинайте построение регэкспа со словесного описания его поведения. Избежите глупых ошибок.
 
Сверху