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...
Пока на собственное сообщение не было ответов, его можно удалить.