регулярное выражение : отрицание строки
От: 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>Возможно конечно, что решение и есть, но в данном случае, ИМХО, проще воспользоваться конструкцией языка.

возможно так и сделаю
Re[7]: регулярное выражение : отрицание строки
От: greek Украина  
Дата: 08.07.04 14:36
Оценка:
G>Тот который я сейчас настраиваю — Yader, написанный на asp

Ссылка http://www.yart.com.au/article.asp?ID=19
Re[7]: регулярное выражение : отрицание строки
От: anonymous Россия http://denis.ibaev.name/
Дата: 08.07.04 15:10
Оценка:
Здравствуйте, greek, Вы писали:

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

A>>ошибаешься, все наоборот...
G>из чего сделан подобный вывод не ясно

из опыта...
Re: регулярное выражение : отрицание строки
От: anonymous Россия http://denis.ibaev.name/
Дата: 08.07.04 15:15
Оценка: 2 (2)
Здравствуйте, greek, Вы писали:

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

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

возможно тебе помогут следующие конструкции:
(?!шаблон)   # после текущей точки не дожно быть текста, соотносимого с шаблоном
(?<!шаблон)  # перед текущей точкой не дожно быть текста, соотносимого с шаблоном
Re: регулярное выражение : отрицание строки
От: Аноним  
Дата: 09.07.04 03:53
Оценка:
Здравствуйте, greek, Вы писали:

G>Прошу помочь

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

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


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


Вон anonymous правильно говорит. Для отрицания юзай lookahead-выражение (?!<шаблон>), для совпадения (?=<шаблон>)

$text = "blablabla";
if ( preg_match( "/^(?!.*abc|.*cda).*$/", $text ) ) {
    print "Текст не содержит строк abc и cda";
} else {
    print "Текст содержит строку abc или cda";
}
Re[2]: регулярное выражение : отрицание строки
От: butcher Россия http://bu7cher.blogspot.com
Дата: 09.07.04 04:33
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Вон anonymous правильно говорит. Для отрицания юзай lookahead-выражение (?!<шаблон>), для совпадения (?=<шаблон>)


А>
А>$text = "blablabla";
А>if ( preg_match( "/^(?!.*abc|.*cda).*$/", $text ) ) {
А>    print "Текст не содержит строк abc и cda";
А>} else {
А>    print "Текст содержит строку abc или cda";
А>}
А>

Данное регулярное выражение тоже не соответсвует поставленной задаче.

Нет ничего невозможного..
Re[3]: регулярное выражение : отрицание строки
От: Аноним  
Дата: 09.07.04 06:17
Оценка:
Здравствуйте, butcher, Вы писали:

B>Здравствуйте, <Аноним>, Вы писали:


А>>Вон anonymous правильно говорит. Для отрицания юзай lookahead-выражение (?!<шаблон>), для совпадения (?=<шаблон>)


А>>
А>>$text = "blablabla";
А>>if ( preg_match( "/^(?!.*abc|.*cda).*$/", $text ) ) {
А>>    print "Текст не содержит строк abc и cda";
А>>} else {
А>>    print "Текст содержит строку abc или cda";
А>>}
А>>

B>Данное регулярное выражение тоже не соответсвует поставленной задаче.

В смысле ? В каком месте ?

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

Строка кода
preg_match( "/^(?!.*abc|.*cda).*$/", 'blablabla' )

ровно это и делает, а именно ищет отсутствие строк(и) в тексте. То есть регэксп матчиться тока когда, нет заданных строк в заданном тексте.

В данном случае строки две : 'abc' и 'cda', текст : 'blalblabla'.

В чем не прав ?
Re[4]: регулярное выражение : отрицание строки
От: butcher Россия http://bu7cher.blogspot.com
Дата: 09.07.04 06:37
Оценка:
Здравствуйте, <Аноним>, Вы писали:

B>>Данное регулярное выражение тоже не соответсвует поставленной задаче.


А>В смысле ? В каком месте ?

А>Строка кода
А>
А>preg_match( "/^(?!.*abc|.*cda).*$/", 'blablabla' )
А>

А>ровно это и делает, а именно ищет отсутствие строк(и) в тексте. То есть регэксп матчиться тока когда, нет заданных строк в заданном тексте.
А>В данном случае строки две : 'abc' и 'cda', текст : 'blalblabla'.
А>В чем не прав ?
Конкретно для вашего примера — да, подходит
Ваше выражение ищет отсутствие строк "может что-то и есть, а может и нетabc" и "может что-то и есть, а может и нетcda", преобразуйте его в вид, чтобы "регэксп матчился" только тогда, когда в заданном тексте нету только целых слов foo, bar
Тогда я с вами соглашусь и поставлю вам оценку "супер"

Нет ничего невозможного..
Re: регулярное выражение : отрицание строки
От: Aquary Россия https://wmspanel.com/
Дата: 09.07.04 06:50
Оценка: +2
Здравствуйте, greek, Вы писали:

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


регекспы принципиально не предназначены для такой задачи, хотя разные (но далеко не все) диалекты позволяют это делать.
регексты отвечают на вопрос "есть ли строка вида ...", а так же берут или заменяют строки указанного вида.

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

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


кроме того, работать мой вариант будет быстрее, т.к. парсинг регекспов с отрицанием, указанных в этом треде, займет гораздо больше времени, чем парсинг регекспа поиска без отрицания + программная конструкция if() самого языка.

если интересно — почитай литературу, например книгу "Регулярные выражения" от o'reilly
https://wmspanel.com/nimble — Nimble Streamer media server for live and VOD HLS, RTMP, HTTP streaming
https://wmspanel.com/ — Control and reporting panel for Wowza and Nimble Streamer
http://scm-notes.blogspot.com/ — Блог об управлении конфигурацией
Re[5]: регулярное выражение : отрицание строки
От: Аноним  
Дата: 09.07.04 06:52
Оценка: -1
Здравствуйте, butcher, Вы писали:

А>>В смысле ? В каком месте ?

А>>Строка кода
А>>
А>>preg_match( "/^(?!.*abc|.*cda).*$/", 'blablabla' )
А>>

А>>ровно это и делает, а именно ищет отсутствие строк(и) в тексте. То есть регэксп матчиться тока когда, нет заданных строк в заданном тексте.
А>>В данном случае строки две : 'abc' и 'cda', текст : 'blalblabla'.
А>>В чем не прав ?

B>Конкретно для вашего примера — да, подходит

B>Ваше выражение ищет отсутствие строк "может что-то и есть, а может и нетabc" и "может что-то и есть, а может и нетcda", преобразуйте его в вид, чтобы "регэксп матчился" только тогда, когда в заданном тексте нету только целых слов foo, bar

Хм... Смотря что понимать под словом "слово"

Например, если "слово" — буквы ограниченные пробелами/концом строки/началом строки, то можно так :
preg_match( "/^(?!.*(\s|^)abc(\s|$)|.*(\s|^)cda(\s|$)).*$/", 'blablabla' )

это типа для только целых слов abc и cda

Ну собственно всегда выражение можно подогнать под свое определение "слова".


B>Тогда я с вами соглашусь и поставлю вам оценку "супер"


Лучше anonymousу поставь. Он сказал ответ, а я лишь реализовал.
Re[6]: регулярное выражение : отрицание строки
От: anonymous Россия http://denis.ibaev.name/
Дата: 09.07.04 08:18
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Хм... Смотря что понимать под словом "слово"


в регулярных выражениях понятие слова точно определено...
Re[5]: регулярное выражение : отрицание строки
От: butcher Россия http://bu7cher.blogspot.com
Дата: 09.07.04 08:24
Оценка:
Здравствуйте, butcher, Вы писали:

B>Конкретно для вашего примера — да, подходит

B>Ваше выражение ищет отсутствие строк "может что-то и есть, а может и нетabc" и "может что-то и есть, а может и нетcda", преобразуйте его в вид, чтобы "регэксп матчился" только тогда, когда в заданном тексте нету только целых слов foo, bar
B>Тогда я с вами соглашусь и поставлю вам оценку "супер"

Вот что-то типа такого, но надо ещё потестить:
/^(?!.*\bfoo\b|.*\bbar\b).*$/

Нет ничего невозможного..
Re[7]: регулярное выражение : отрицание строки
От: Аноним  
Дата: 09.07.04 10:02
Оценка: :))
Здравствуйте, anonymous, Вы писали:

А>>Хм... Смотря что понимать под словом "слово"


A>в регулярных выражениях понятие слова точно определено...


Полностью согласен.

Но мое регулярное выражение полностью соответствует задаче. В формулировке слова "слово" нет, есть только "строка" и "текст". Так что butcher протупил первее — неправильно понял задачу. Давайте ему за его замечание минус поставим .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.