Здравствуйте, greek, Вы писали:
G>Вопрос остается в силе... G>правильное решение так и не было высказано
ИМХО, назначение регулярных выражений — поиск совпадения, а не наоборот
Когда-то давно я тоже озадачивал себя такой проблемой, но решения так и не нашёл..
Возможно конечно, что решение и есть, но в данном случае, ИМХО, проще воспользоваться конструкцией языка.
Здравствуйте, greek, Вы писали:
G>Необходимо составить регулярное выражение, которое искало бы отсутствие строки в тексте... G>то есть, что то вроде "НЕ (искомая строка)" G>как сделать отрицание?
возможно тебе помогут следующие конструкции:
(?!шаблон) # после текущей точки не дожно быть текста, соотносимого с шаблоном
(?<!шаблон) # перед текущей точкой не дожно быть текста, соотносимого с шаблоном
Здравствуйте, ЖуК, Вы писали:
ЖуК>Здравствуйте, greek, Вы писали:
G>>Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.
ЖуК>
ЖуК>/[^(str|foo|bar)]/
ЖуК>
Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.
Здравствуйте, greek, Вы писали:
G>как сделать отрицание?
регекспы принципиально не предназначены для такой задачи, хотя разные (но далеко не все) диалекты позволяют это делать.
регексты отвечают на вопрос "есть ли строка вида ...", а так же берут или заменяют строки указанного вида.
отрицание означает, что не нашлось подстроки соответствующей требуемой.
поэтому, опять же имхо, здесь идеологически более правильно воспользоваться конструкицями языка.
кроме того, работать мой вариант будет быстрее, т.к. парсинг регекспов с отрицанием, указанных в этом треде, займет гораздо больше времени, чем парсинг регекспа поиска без отрицания + программная конструкция if() самого языка.
если интересно — почитай литературу, например книгу "Регулярные выражения" от o'reilly
Здравствуйте, anonymous, Вы писали:
А>>Хм... Смотря что понимать под словом "слово"
A>в регулярных выражениях понятие слова точно определено...
Полностью согласен.
Но мое регулярное выражение полностью соответствует задаче. В формулировке слова "слово" нет, есть только "строка" и "текст". Так что butcher протупил первее — неправильно понял задачу. Давайте ему за его замечание минус поставим .
ЖуК>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.
отрицание только в классах символов... твое выражение интерпретируется как "стока не содержит ни одного из символов [()|abforst]"...
ЖуК>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.
вы хотите сказать, что такой регэксп значит — "истина, если в строке нет таких слов"?
ЖуК>>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.
Здравствуйте, greek, Вы писали:
G>Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации ...
Здравствуйте, butcher, Вы писали:
B>Здравствуйте, ЖуК, Вы писали:
ЖуК>>>
ЖуК>>>/[^(str|foo|bar)]/
ЖуК>>>
ЖуК>>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание. B>вы хотите сказать, что такой регэксп значит — "истина, если в строке нет таких слов"?
А>>ровно это и делает, а именно ищет отсутствие строк(и) в тексте. То есть регэксп матчиться тока когда, нет заданных строк в заданном тексте. А>>В данном случае строки две : 'abc' и 'cda', текст : 'blalblabla'. А>>В чем не прав ?
B>Конкретно для вашего примера — да, подходит B>Ваше выражение ищет отсутствие строк "может что-то и есть, а может и нетabc" и "может что-то и есть, а может и нетcda", преобразуйте его в вид, чтобы "регэксп матчился" только тогда, когда в заданном тексте нету только целых слов foo, bar
Хм... Смотря что понимать под словом "слово"
Например, если "слово" — буквы ограниченные пробелами/концом строки/началом строки, то можно так :
Здравствуйте, greek, Вы писали:
G>Необходимо составить регулярное выражение, которое искало бы отсутствие строки в тексте... G>то есть, что то вроде "НЕ (искомая строка)" G>как сделать отрицание?
это зависит от языка, регулярное выражение изменять не обязательно, наример в Perl:
if ($str =~ s/<regexp>/) { ... } # истина при соответствии регулярному выражениюif ($str !~ s/<regexp>/) { ... } # истина при несоответствии регулярному выражению
Здравствуйте, anonymous, Вы писали:
A>Здравствуйте, greek, Вы писали:
G>>Необходимо составить регулярное выражение, которое искало бы отсутствие строки в тексте... G>>то есть, что то вроде "НЕ (искомая строка)" G>>как сделать отрицание?
A>это зависит от языка, регулярное выражение изменять не обязательно, наример в Perl: A>
A>if ($str =~ s/<regexp>/) { ... } # истина при соответствии регулярному выражению
A>if ($str !~ s/<regexp>/) { ... } # истина при несоответствии регулярному выражению
A>
Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.
ЖуК>Не понял, бучер, ты с чем не согласен? С тем, что [^] — отрицание в регекспах? Читай маны, бучер. Тебе кажется, что ^ — признак начала строки? Так вот — [^ — отрицание.
Здравствуйте, greek, Вы писали:
G>Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями.
а чем вызвано нежелание пользоваться языковыми конструкциями?
Здравствуйте, butcher, Вы писали:
B>Здравствуйте, greek, Вы писали:
G>>Фишка в том, что мне надо создать именно регулярное выражение, а не пользоваться языковыми конструкциями. B>а чем вызвано нежелание пользоваться языковыми конструкциями?
Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации ...
Здравствуйте, greek, Вы писали: G>Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации ...
простите, что не в тему, но что такое спайдер, зачем он нужен и чем хорош?
Здравствуйте, anonymous, Вы писали:
A>Здравствуйте, greek, Вы писали:
G>>Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации ...
A>ошибаешься, все наоборот...
из чего сделан подобный вывод не ясно
А>простите, что не в тему, но что такое спайдер, зачем он нужен и чем хорош?
спайдер — паук.
Лазит по ссылкам на сайте и индексирует контент.
По этим данным потом осуществляется поиск по сайту и выдача ссылочек, на страницах которых была найдена искомая фраза.
Тот который я сейчас настраиваю — Yader, написанный на asp
Здравствуйте, butcher, Вы писали:
B>Здравствуйте, greek, Вы писали:
G>>Вопрос остается в силе... G>>правильное решение так и не было высказано B>ИМХО, назначение регулярных выражений — поиск совпадения, а не наоборот B>Когда-то давно я тоже озадачивал себя такой проблемой, но решения так и не нашёл.. B>Возможно конечно, что решение и есть, но в данном случае, ИМХО, проще воспользоваться конструкцией языка.
Здравствуйте, greek, Вы писали:
G>>>Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации ... A>>ошибаешься, все наоборот... 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";
}
Здравствуйте, <Аноним>, Вы писали:
B>>Данное регулярное выражение тоже не соответсвует поставленной задаче.
А>В смысле ? В каком месте ? А>Строка кода А>
А>ровно это и делает, а именно ищет отсутствие строк(и) в тексте. То есть регэксп матчиться тока когда, нет заданных строк в заданном тексте. А>В данном случае строки две : 'abc' и 'cda', текст : 'blalblabla'. А>В чем не прав ?
Конкретно для вашего примера — да, подходит
Ваше выражение ищет отсутствие строк "может что-то и есть, а может и нетabc" и "может что-то и есть, а может и нетcda", преобразуйте его в вид, чтобы "регэксп матчился" только тогда, когда в заданном тексте нету только целых слов foo, bar
Тогда я с вами соглашусь и поставлю вам оценку "супер"
Здравствуйте, butcher, Вы писали:
B>Конкретно для вашего примера — да, подходит B>Ваше выражение ищет отсутствие строк "может что-то и есть, а может и нетabc" и "может что-то и есть, а может и нетcda", преобразуйте его в вид, чтобы "регэксп матчился" только тогда, когда в заданном тексте нету только целых слов foo, bar B>Тогда я с вами соглашусь и поставлю вам оценку "супер"