нужно составить регулярное выражение проверка на совпадение которого была бы true если в исходной строке НЕ присутствуют заданные строки.
например если в строке не присутствуют .exe и .dll, то подходит
Здравствуйте, Аноним, Вы писали:
А>нужно составить регулярное выражение проверка на совпадение которого была бы true если в исходной строке НЕ присутствуют заданные строки. А>например если в строке не присутствуют .exe и .dll, то подходит
Вам какие регулярные выражения-то нужны? Ну, например, в boost::regex (см. также эту доку: http://www.onlamp.com/lpt/a/6535) можно так: .+\.(exe|dll)$
А может вам и вовсе без них обойтись? Скажем можно так:
В данном случае будет сравниваться последние четыре символа строки на совпадение. (Можно использовать strcasecmsp() вместо простого strcmp() для получения case insensitive поиска)
Re[2]: Подскажите с регулярным выражением
От:
Аноним
Дата:
22.06.08 21:45
Оценка:
Здравствуйте, php-coder, Вы писали:
PC>Здравствуйте, Аноним, Вы писали:
PC>Вам какие регулярные выражения-то нужны? Ну, например, в boost::regex (см. также эту доку: http://www.onlamp.com/lpt/a/6535) можно так: .+\.(exe|dll)$
использую boost::regex .+\.(exe|dll)$ — здесь boost::regex_match вернет true если .exe или .dll присутствует, и false если не присутствуют
а мне нужно нааборот если, присутсвуют то false. если отсутсвуют то true.
в принципе вот может быть задача сводится к тому есть ли в регексах логическое нет
PC>А может вам и вовсе без них обойтись? Скажем можно так:
нельзя, только через регексы, долго объяснять почему, нужно найти решение задачи так как она поставлена
Здравствуйте, Аноним, Вы писали:
А>Привет всем.
А>нужно составить регулярное выражение проверка на совпадение которого была бы true если в исходной строке НЕ присутствуют заданные строки. А>например если в строке не присутствуют .exe и .dll, то подходит
А>Спасибо за помощь.
ну, поскольку ты все равно проверяешь результат матчинга, то его можно просто проверять не на true, а на false
if ( ! re.match(string) ) ...
Но если тебе нужно именно через regex-ы, заюзать negative look-ahead (?!exe|dll) и look-behind (?<!exe|dll). Первый смотрит вперед, последний — назад.
А>нужно составить регулярное выражение проверка на совпадение которого была бы true если в исходной строке НЕ присутствуют заданные строки. А>например если в строке не присутствуют .exe и .dll, то подходит
Была похожая тема:
$A = 'AAA';
$B = 'BBB';
$Z = 'ZZZ';
$_ = 'DDD AAA FFF BBB ZZZ BBB ZZZ EEE';
if (/$A(??!$Z).)*$B/) {
print "$&\n";
}
Это несколько более универсально. Строка не содержит $Z до вхождения $B (после $A)
Здравствуйте, jazzer, Вы писали:
J>Но если тебе нужно именно через regex-ы, заюзать negative look-ahead (?!exe|dll) и look-behind (?<!exe|dll). Первый смотрит вперед, последний — назад.
ну вообщем примерно так да, спасибо.
выражение подобрал, и в разных прогах по тестированию регулярных выражений все нормально протестировалсь, но новая трабла возникла, boost не возвращает соответствие, делаю так
bool test = boost::regex_match("test.doc", regex ("\.(?!exe|dll)", boost::match_default));
получаю false, может для lookahead-а какой-то флаг нужен? подскажите плиз с этим тоже
boost 1.35
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, jazzer, Вы писали:
J>>Но если тебе нужно именно через regex-ы, заюзать negative look-ahead (?!exe|dll) и look-behind (?<!exe|dll). Первый смотрит вперед, последний — назад.
А>ну вообщем примерно так да, спасибо. А>выражение подобрал, и в разных прогах по тестированию регулярных выражений все нормально протестировалсь, но новая трабла возникла, boost не возвращает соответствие, делаю так А>bool test = boost::regex_match("test.doc", regex ("\.(?!exe|dll)", boost::match_default)); А>получаю false, может для lookahead-а какой-то флаг нужен? подскажите плиз с этим тоже А>boost 1.35
regex_match требует, чтобы вся строка попадала под регекс, а у тебя только часть попадает.
Так что либо делай полный регекс, либо используй regex_search — он будет искать именно частичное совпадение.
Кстати, если у тебя всегда строка оканчивается тем, что ты хочешь найти, используй доллар в конце регэкса — будет существенно быстрее искать
You will always get what you always got
If you always do what you always did
Re[4]: Подскажите с регулярным выражением
От:
Аноним
Дата:
23.06.08 06:16
Оценка:
Здравствуйте, jazzer, Вы писали:
J>regex_match требует, чтобы вся строка попадала под регекс, а у тебя только часть попадает. J>Так что либо делай полный регекс, либо используй regex_search — он будет искать именно частичное совпадение.
что значит полный регекс?
J>Кстати, если у тебя всегда строка оканчивается тем, что ты хочешь найти, используй доллар в конце регэкса — будет существенно быстрее искать
нет, после анализируемого фргамента еще может быть текст
а так быстрее будет? — \.(?!exe|dll).*$
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, jazzer, Вы писали:
J>>regex_match требует, чтобы вся строка попадала под регекс, а у тебя только часть попадает. J>>Так что либо делай полный регекс, либо используй regex_search — он будет искать именно частичное совпадение.
А>что значит полный регекс?
который матчит строку целиком: .*\.(?!exe|dll).*
J>>Кстати, если у тебя всегда строка оканчивается тем, что ты хочешь найти, используй доллар в конце регэкса — будет существенно быстрее искать А>нет, после анализируемого фргамента еще может быть текст А>а так быстрее будет? — \.(?!exe|dll).*$
нет, тогда быстрее не будет.
регексы ускоряются, когда можно привязаться к чему-то, что можно быстро сматчить, типа конца строки.
Здравствуйте, Аноним, Вы писали:
J>>regex_match требует, чтобы вся строка попадала под регекс, а у тебя только часть попадает. J>>Так что либо делай полный регекс, либо используй regex_search — он будет искать именно частичное совпадение. А>что значит полный регекс?
См. выделенное.
Re[6]: Подскажите с регулярным выражением
От:
Аноним
Дата:
23.06.08 06:33
Оценка:
Здравствуйте, jazzer, Вы писали:
опять не задалось, теперь возвращет true в обоих случаях, хотя во втором не должно
bool test = boost::regex_search ("test.doc", regex ("\.(?!exe|dll)", boost::match_default));
test = boost::regex_search ("test.exe", regex ("\.(?!exe|dll)", boost::match_default));
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, jazzer, Вы писали:
А>опять не задалось, теперь возвращет true в обоих случаях, хотя во втором не должно
А>bool test = boost::regex_search ("test.doc", regex ("\.(?!exe|dll)", boost::match_default)); А>test = boost::regex_search ("test.exe", regex ("\.(?!exe|dll)", boost::match_default));
а так:
test = boost::regex_search ("test.exe", regex ("\.(?!exe)"));
ЗЫ Зачем ты все время boost::match_default пишешь? Или не работает без него?
You will always get what you always got
If you always do what you always did
Re[8]: Подскажите с регулярным выражением
От:
Аноним
Дата:
23.06.08 06:48
Оценка:
Здравствуйте, jazzer, Вы писали:
match_default убрал, но
test = boost::regex_search ("test.exe", regex ("\.(?!exe)"));
опять true вернуло, и второй вариант из скобок убрал, хотя мне нужно будет в несколько вариантов
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, jazzer, Вы писали:
А>match_default убрал, но А>test = boost::regex_search ("test.exe", regex ("\.(?!exe)")); А>опять true вернуло, и второй вариант из скобок убрал, хотя мне нужно будет в несколько вариантов
ну возьми все выражение в скобочки и посмотри, что match_results вернет.
You will always get what you always got
If you always do what you always did
Re[10]: Подскажите с регулярным выражением
От:
Аноним
Дата:
23.06.08 08:00
Оценка:
Здравствуйте, jazzer, Вы писали:
не совсем понял в чем причина, но когда исходную строку и регулярное выражение стал не в коде задавать а считывать как будет в конечном итоге с файла все нормально отрабатывалось.
может потому что в проекте поддержка юникода есть? и в этом случае нужно в методы юникодовые строки передавать и использовать юникодовые классы у boost::regex вроде есть такие.
А>не совсем понял в чем причина, но когда исходную строку и регулярное выражение стал не в коде задавать а считывать как будет в конечном итоге с файла все нормально отрабатывалось.
Ну это м.б. банально из-за невнимательности при экранировании обратных слэшей.
Например, в регэксах "\." обозначает "проматчить с точкой", а в си-строке это равносильно просто ".", что для регэкса означает 1 любой символ
Т.е регэкс "\." в си-строках выглядит как "\\."