регулярное выражение : отрицание строки
От: greek Украина  
Дата: 08.07.04 10:37
Оценка:
Привет всем!

Прошу помочь
Необходимо составить регулярное выражение, которое искало бы отсутствие строки в тексте...


то есть, что то вроде "НЕ (искомая строка)"

как сделать отрицание?

Извиняюсь за сумбур....
Re: регулярное выражение : отрицание строки
От: anonymous Россия http://denis.ibaev.name/
Дата: 08.07.04 10:54
Оценка:
Здравствуйте, greek, Вы писали:

G>Необходимо составить регулярное выражение, которое искало бы отсутствие строки в тексте...

G>то есть, что то вроде "НЕ (искомая строка)"
G>как сделать отрицание?

это зависит от языка, регулярное выражение изменять не обязательно, наример в Perl:
if ($str =~ s/<regexp>/) { ... }   # истина при соответствии регулярному выражению
if ($str !~ s/<regexp>/) { ... }   # истина при несоответствии регулярному выражению
Re[2]: регулярное выражение : отрицание строки
От: greek Украина  
Дата: 08.07.04 11:07
Оценка:
Здравствуйте, anonymous, Вы писали:

A>Здравствуйте, greek, Вы писали:


G>>Необходимо составить регулярное выражение, которое искало бы отсутствие строки в тексте...

G>>то есть, что то вроде "НЕ (искомая строка)"
G>>как сделать отрицание?

A>это зависит от языка, регулярное выражение изменять не обязательно, наример в Perl:

A>
A>if ($str =~ s/<regexp>/) { ... }   # истина при соответствии регулярному выражению
A>if ($str !~ s/<regexp>/) { ... }   # истина при несоответствии регулярному выражению
A>


Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.
Re[3]: регулярное выражение : отрицание строки
От: ЖуК Украина http://smart-ip.net/
Дата: 08.07.04 11:18
Оценка: -2
Здравствуйте, greek, Вы писали:

G>Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.


/[^(str|foo|bar)]/
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[4]: регулярное выражение : отрицание строки
От: ЖуК Украина http://smart-ip.net/
Дата: 08.07.04 11:35
Оценка: :))
Здравствуйте, ЖуК, Вы писали:

ЖуК>Здравствуйте, greek, Вы писали:


G>>Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.


ЖуК>
ЖуК>/[^(str|foo|bar)]/
ЖуК>


Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[5]: регулярное выражение : отрицание строки
От: anonymous Россия http://denis.ibaev.name/
Дата: 08.07.04 11:43
Оценка: 8 (1)
Здравствуйте, ЖуК, Вы писали:

ЖуК>>
ЖуК>>/[^(str|foo|bar)]/
ЖуК>>


ЖуК>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.


отрицание только в классах символов... твое выражение интерпретируется как "стока не содержит ни одного из символов [()|abforst]"...
Re[5]: регулярное выражение : отрицание строки
От: butcher Россия http://bu7cher.blogspot.com
Дата: 08.07.04 11:45
Оценка: 8 (1)
Здравствуйте, ЖуК, Вы писали:

ЖуК>>
ЖуК>>/[^(str|foo|bar)]/
ЖуК>>


ЖуК>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.

вы хотите сказать, что такой регэксп значит — "истина, если в строке нет таких слов"?

Нет ничего невозможного..
Re[4]: регулярное выражение : отрицание строки
От: butcher Россия http://bu7cher.blogspot.com
Дата: 08.07.04 11:46
Оценка:
Здравствуйте, ЖуК, Вы писали:

G>>Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.


ЖуК>
ЖуК>/[^(str|foo|bar)]/
ЖуК>


простой тест: "напечатать строку, если в ней нет слов foo, bar, str"
#!/usr/local/bin/perl

use strict;
my $str = "foo, bar, str";
print "$str\n" if ($str =~ /[^(str|foo|bar)]/);

Результат:
# ./test.pl
foo, bar, str

Нет ничего невозможного..
Re[5]: регулярное выражение : отрицание строки
От: greek Украина  
Дата: 08.07.04 11:53
Оценка:
ЖуК>>
ЖуК>>/[^(str|foo|bar)]/
ЖуК>>


ЖуК>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.



по-моему не работает..
Re[6]: регулярное выражение : отрицание строки
От: ЖуК Украина http://smart-ip.net/
Дата: 08.07.04 11:57
Оценка: 2 (1)
Здравствуйте, greek, Вы писали:


ЖуК>>>
ЖуК>>>/[^(str|foo|bar)]/
ЖуК>>>


ЖуК>>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.



G>по-моему не работает..


А по-моему, работает:


<?php
error_reporting( E_ALL);
$strings = array( 'str', 'foo', 'bar', 'blablabla');
foreach ($strings as $str) {
    echo preg_match( '/[^(str|foo|bar)]/', $str) ? $str . '<br>' : 'forbidden string<br>';
}
?>



Результат здесь

З.Ы. Иля я чего-то не понимаю?
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[3]: регулярное выражение : отрицание строки
От: butcher Россия http://bu7cher.blogspot.com
Дата: 08.07.04 11:57
Оценка:
Здравствуйте, greek, Вы писали:

G>Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.

а чем вызвано нежелание пользоваться языковыми конструкциями?

Нет ничего невозможного..
Re[4]: регулярное выражение : отрицание строки
От: greek Украина  
Дата: 08.07.04 12:02
Оценка:
Здравствуйте, butcher, Вы писали:

B>Здравствуйте, greek, Вы писали:


G>>Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.

B>а чем вызвано нежелание пользоваться языковыми конструкциями?

Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации ...
Re[7]: регулярное выражение : отрицание строки
От: greek Украина  
Дата: 08.07.04 12:09
Оценка:
ЖуК>А по-моему, работает:


ЖуК>
ЖуК><?php
ЖуК>error_reporting( E_ALL);
ЖуК>$strings = array( 'str', 'foo', 'bar', 'blablabla');
ЖуК>foreach ($strings as $str) {
ЖуК>    echo preg_match( '/[^(str|foo|bar)]/', $str) ? $str . '<br>' : 'forbidden string<br>';
ЖуК>}
ЖуК>?>
ЖуК>



ЖуК>Результат здесь


ЖуК>З.Ы. Иля я чего-то не понимаю?


ну наверное я некорректно объяснил...


вот чуток измененные строки, с которыми предложенное решение не работает:
<?php
error_reporting( E_ALL);
$strings = array( 'adsf&str=ru', ' asdf foo asdf', ' sdf bard fd', 'blablabla');
foreach ($strings as $str) {
    echo preg_match( '/[^(str|foo|bar)]/', $str) ? $str . '<br>' : 'forbidden string<br>';
}
?>


вот результат:

adsf&str=ru
asdf foo asdf
sdf bard fd
blablabla
Re[5]: регулярное выражение : отрицание строки
От: anonymous Россия http://denis.ibaev.name/
Дата: 08.07.04 12:24
Оценка: :)
Здравствуйте, greek, Вы писали:

G>Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации ...


ошибаешься, все наоборот...
Re[5]: регулярное выражение : отрицание строки
От: Аноним  
Дата: 08.07.04 12:27
Оценка:
Здравствуйте, greek, Вы писали:
G>Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации ...

простите, что не в тему, но что такое спайдер, зачем он нужен и чем хорош?
Re[6]: регулярное выражение : отрицание строки
От: ЖуК Украина http://smart-ip.net/
Дата: 08.07.04 12:38
Оценка: :)
Здравствуйте, butcher, Вы писали:

B>Здравствуйте, ЖуК, Вы писали:


ЖуК>>>
ЖуК>>>/[^(str|foo|bar)]/
ЖуК>>>


ЖуК>>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.

B>вы хотите сказать, что такой регэксп значит — "истина, если в строке нет таких слов"?

Бучер, извини, гоню
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re[6]: регулярное выражение : отрицание строки
От: greek Украина  
Дата: 08.07.04 14:07
Оценка:
Здравствуйте, anonymous, Вы писали:

A>Здравствуйте, greek, Вы писали:


G>>Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации ...


A>ошибаешься, все наоборот...

из чего сделан подобный вывод не ясно


Вопрос остается в силе...


правильное решение так и не было высказано
Re[6]: регулярное выражение : отрицание строки
От: greek Украина  
Дата: 08.07.04 14:10
Оценка:
А>простите, что не в тему, но что такое спайдер, зачем он нужен и чем хорош?

спайдер — паук.

Лазит по ссылкам на сайте и индексирует контент.
По этим данным потом осуществляется поиск по сайту и выдача ссылочек, на страницах которых была найдена искомая фраза.

Тот который я сейчас настраиваю — Yader, написанный на asp
Re[7]: регулярное выражение : отрицание строки
От: butcher Россия http://bu7cher.blogspot.com
Дата: 08.07.04 14:26
Оценка: 7 (2) +1
Здравствуйте, greek, Вы писали:

G>Вопрос остается в силе...

G>правильное решение так и не было высказано
ИМХО, назначение регулярных выражений — поиск совпадения, а не наоборот
Когда-то давно я тоже озадачивал себя такой проблемой, но решения так и не нашёл..
Возможно конечно, что решение и есть, но в данном случае, ИМХО, проще воспользоваться конструкцией языка.

Нет ничего невозможного..
Re[8]: регулярное выражение : отрицание строки
От: greek Украина  
Дата: 08.07.04 14:29
Оценка:
Здравствуйте, butcher, Вы писали:

B>Здравствуйте, greek, Вы писали:


G>>Вопрос остается в силе...

G>>правильное решение так и не было высказано
B>ИМХО, назначение регулярных выражений — поиск совпадения, а не наоборот
B>Когда-то давно я тоже озадачивал себя такой проблемой, но решения так и не нашёл..
B>Возможно конечно, что решение и есть, но в данном случае, ИМХО, проще воспользоваться конструкцией языка.

возможно так и сделаю
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.