Здравствуйте, greek, Вы писали:
G>>>Да мне просто надо настроить движек спайдера, поэтому составить рег выражение — быстрее, чем вникать в логику реализации ... A>>ошибаешься, все наоборот... G>из чего сделан подобный вывод не ясно
Здравствуйте, 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";
}
Здравствуйте, <Аноним>, Вы писали:
B>>Данное регулярное выражение тоже не соответсвует поставленной задаче.
А>В смысле ? В каком месте ? А>Строка кода А>
А>ровно это и делает, а именно ищет отсутствие строк(и) в тексте. То есть регэксп матчиться тока когда, нет заданных строк в заданном тексте. А>В данном случае строки две : 'abc' и 'cda', текст : 'blalblabla'. А>В чем не прав ?
Конкретно для вашего примера — да, подходит
Ваше выражение ищет отсутствие строк "может что-то и есть, а может и нетabc" и "может что-то и есть, а может и нетcda", преобразуйте его в вид, чтобы "регэксп матчился" только тогда, когда в заданном тексте нету только целых слов foo, bar
Тогда я с вами соглашусь и поставлю вам оценку "супер"
Здравствуйте, greek, Вы писали:
G>как сделать отрицание?
регекспы принципиально не предназначены для такой задачи, хотя разные (но далеко не все) диалекты позволяют это делать.
регексты отвечают на вопрос "есть ли строка вида ...", а так же берут или заменяют строки указанного вида.
отрицание означает, что не нашлось подстроки соответствующей требуемой.
поэтому, опять же имхо, здесь идеологически более правильно воспользоваться конструкицями языка.
кроме того, работать мой вариант будет быстрее, т.к. парсинг регекспов с отрицанием, указанных в этом треде, займет гораздо больше времени, чем парсинг регекспа поиска без отрицания + программная конструкция if() самого языка.
если интересно — почитай литературу, например книгу "Регулярные выражения" от o'reilly
А>>ровно это и делает, а именно ищет отсутствие строк(и) в тексте. То есть регэксп матчиться тока когда, нет заданных строк в заданном тексте. А>>В данном случае строки две : 'abc' и 'cda', текст : 'blalblabla'. А>>В чем не прав ?
B>Конкретно для вашего примера — да, подходит B>Ваше выражение ищет отсутствие строк "может что-то и есть, а может и нетabc" и "может что-то и есть, а может и нетcda", преобразуйте его в вид, чтобы "регэксп матчился" только тогда, когда в заданном тексте нету только целых слов foo, bar
Хм... Смотря что понимать под словом "слово"
Например, если "слово" — буквы ограниченные пробелами/концом строки/началом строки, то можно так :
Здравствуйте, butcher, Вы писали:
B>Конкретно для вашего примера — да, подходит B>Ваше выражение ищет отсутствие строк "может что-то и есть, а может и нетabc" и "может что-то и есть, а может и нетcda", преобразуйте его в вид, чтобы "регэксп матчился" только тогда, когда в заданном тексте нету только целых слов foo, bar B>Тогда я с вами соглашусь и поставлю вам оценку "супер"
Вот что-то типа такого, но надо ещё потестить:
/^(?!.*\bfoo\b|.*\bbar\b).*$/
Нет ничего невозможного..
Re[7]: регулярное выражение : отрицание строки
От:
Аноним
Дата:
09.07.04 10:02
Оценка:
Здравствуйте, anonymous, Вы писали:
А>>Хм... Смотря что понимать под словом "слово"
A>в регулярных выражениях понятие слова точно определено...
Полностью согласен.
Но мое регулярное выражение полностью соответствует задаче. В формулировке слова "слово" нет, есть только "строка" и "текст". Так что butcher протупил первее — неправильно понял задачу. Давайте ему за его замечание минус поставим .