Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

тупака поймал с regexp

333
08 марта 2008 года
GHopper
200 / / 28.12.2004
Здравствуйте!

/^[^m]*$/m - паттерн, соответствует всем строкам, не содержащим символ "m".
тогда как будет выглядеть паттерн, который соответствует всем строкам, не содержащим подстроку "mm"?

P.S. почему /^[^m]*$/m не срабатывает для пустых строк?
353
08 марта 2008 года
Nixus
840 / / 04.01.2007
Цитата: GHopper
тогда как будет выглядеть паттерн, который соответствует всем строкам, не содержащим подстроку "mm"?


 
Код:
$str !~ /mm/


Цитата: GHopper
P.S. почему /^[^m]*$/m не срабатывает для пустых строк?


Вообще-то срабатывает.

24K
08 марта 2008 года
ostgals
53 / / 27.08.2007
/^[^m]*$/m соответствует лишь такой цепочке символов, где до первого символа переноса строки не встречается символ m, следовательно для пустых строк это выражение работать не будет, так как пустая строка не содержит символа переноса.

P.S. Может чуть расширить контекст задачи? ;) Речь вообще про JavaScript?
353
08 марта 2008 года
Nixus
840 / / 04.01.2007
Цитата: ostgals
/^[^m]*$/m соответствует лишь такой цепочке символов, где до первого символа переноса строки не встречается символ m, следовательно для пустых строк это выражение работать не будет, так как пустая строка не содержит символа переноса.


RTFM. Без комментариев.

333
08 марта 2008 года
GHopper
200 / / 28.12.2004
Цитата: Nixus
 
Код:
$str !~ /mm/

Вообще-то срабатывает.



Не дошло до меня ( Можно по-подробнее?

Задачу решаю на PHP (PCRE).

353
08 марта 2008 года
Nixus
840 / / 04.01.2007
 
Код:
if(!preg_match("/mm/", $s))
{
      //   Код для случая когда в строке нет mm
}
333
08 марта 2008 года
GHopper
200 / / 28.12.2004
$s = preg_replace("/mm/", "", $s); - уберет все "mm" из текста $s. На строчки эта конструкция вообще никак не повлияет!


$s = preg_replace("/^[^m]*$/m", "", $s); - удалит все СТРОКИ, не имеющие символ "m".

Вопрос: как изменить вторую конструкцию, чтобы вместо "m" искалась подстрока "mm"?
304
09 марта 2008 года
Fenyx
707 / / 26.01.2005
Цитата: GHopper
$s = preg_replace("/mm/", "", $s); - уберет все "mm" из текста $s. На строчки эта конструкция вообще никак не повлияет!


$s = preg_replace("/^[^m]*$/m", "", $s); - удалит все СТРОКИ, не имеющие символ "m".

Вопрос: как изменить вторую конструкцию, чтобы вместо "m" искалась подстрока "mm"?


Во первых не тестил но "/^[^m]*$/m" ищет от начала строки до КОНЦА
ыо вторых использовать регулярки для замены текста не то что глупо ... далее идет нецензурный текст
В третих где конструкция () которая определят ЧТО заменять
в четвертых пака хватит

333
09 марта 2008 года
GHopper
200 / / 28.12.2004
Цитата: Fenyx
Во первых не тестил но "/^[^m]*$/m" ищет от начала строки до КОНЦА
ыо вторых использовать регулярки для замены текста не то что глупо ... далее идет нецензурный текст
В третих где конструкция () которая определят ЧТО заменять
в четвертых пака хватит



1. Ищет! От начала строки и до конца! И заменяет все что найдено на "".
2. Если не использовать регулярные выражения для замены текста, то для чего их тогда вообще использовать??? Неужели только для поиска?
Можно предположить, что данная задача решается без использования регулярных вырожений, но у меня задача рассмотреть возможность написания такого паттерна, а не практическая реализация конкретной задачи.
3. смотри п.1 В данном случае использовать обратные ссылки нет необходимости.


P.S. неужели великий и могучий REGEXP не способен выполнить простецкую задачку - убрать все строки, где отсутствует определенная последовательности символов? :(

353
09 марта 2008 года
Nixus
840 / / 04.01.2007
Цитата: GHopper
P.S. неужели великий и могучий REGEXP не способен выполнить простецкую задачку - убрать все строки, где отсутствует определенная последовательности символов? :(


Почему? Способен!

 
Код:
split
foreach {
  if(!preg_match
      array_push
}
15K
09 марта 2008 года
hel
78 / / 10.11.2007
попробуй поиграться с preg_replace("/(m(?!m))/", "", $s);
но примерно я думаю что данная задумка не осуществима с помощью пкре в том понимании в каком ты это представляешь. для этого более лёгкие и быстрые вещи есть, например strpos...

и в мануале php есть глава по регуляркам, почитай обязательно.
333
09 марта 2008 года
GHopper
200 / / 28.12.2004
Мануалы до дыр уже затер! С утверждениями конечно-же пробывал решить задачу - безрезультатно. Сдается мне, что на данной стадии своего развития REGEXP не способны на такие маневры, а нам остается использовать разного рода костыли (циклы, strpos и т.п.). А задача-то - простецкая!
353
09 марта 2008 года
Nixus
840 / / 04.01.2007
Цитата: GHopper
Сдается мне, что на данной стадии своего развития REGEXP не способны на такие маневры, а нам остается использовать разного рода костыли (циклы, strpos и т.п.).


На Perl это делается одной строчкой и без циклов, так что все претензии к Zend'у.

333
09 марта 2008 года
GHopper
200 / / 28.12.2004
Цитата: Nixus
На Perl это делается одной строчкой и без циклов, так что все претензии к Zend'у.



ну так покажи мне эту строчку! Насколько мне известно реализация REGEXP в PHP мало чем отличается от Perl.

353
09 марта 2008 года
Nixus
840 / / 04.01.2007
Цитата: GHopper
ну так покажи мне эту строчку! Насколько мне известно реализация REGEXP в PHP мало чем отличается от Perl.



 
Код:
my $b = "213\nmm\n123mm124\n34m56346";
[COLOR="Green"]my $a = ''; $b =~ s/(^?.*?mm.*?(\r?\n|$))/$a .= $1/egi;[/COLOR]
print $a;
2
09 марта 2008 года
squirL
5.6K / / 13.08.2003
Цитата: GHopper
P.S. неужели великий и могучий REGEXP не способен выполнить простецкую задачку - убрать все строки, где отсутствует определенная последовательности символов? :(



cat file | perl -ni -e "print if (/mm/)"

убираем из файла все строки где нет mm.

cat file | perl -ni -e "print if (! /mm/)"

убираем все, где mm есть.

вариант - вместо ! /mm/ - использовать [^m][^m], но такой вариант вырежет пустые строки.

в чем проблема то??

24K
09 марта 2008 года
ostgals
53 / / 27.08.2007
 
Код:
$lines = array
(
    'abc',
    'mab',
    'abm',
    'mmm',
    'amm',
);

print_r(array_diff($lines, preg_grep("/mm/i", $lines)));
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог