Подскажите с регулярным выражением
От: Аноним  
Дата: 22.06.08 06:46
Оценка:
Привет всем.

нужно составить регулярное выражение проверка на совпадение которого была бы true если в исходной строке НЕ присутствуют заданные строки.
например если в строке не присутствуют .exe и .dll, то подходит

Спасибо за помощь.
Re: Подскажите с регулярным выражением
От: php-coder Чехия http://slava-semushin.blogspot.com
Дата: 22.06.08 20:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>нужно составить регулярное выражение проверка на совпадение которого была бы true если в исходной строке НЕ присутствуют заданные строки.

А>например если в строке не присутствуют .exe и .dll, то подходит

Вам какие регулярные выражения-то нужны? Ну, например, в boost::regex (см. также эту доку: http://www.onlamp.com/lpt/a/6535) можно так: .+\.(exe|dll)$

А может вам и вовсе без них обойтись? Скажем можно так:

if (strstr(your_string, ".exe") == NULL && strstr(your_string, ".dll") == NULL) {
    return true;
}

return false;


Это пример на С, в С++ используйте string::find().

А можно и так:
#define EXTENSION_SIZE 4

const size_t str_size = strlen(your_string);
const char *extension_start = your_string + str_size - EXTENSION_SIZE;
if (str_size > EXTENSION_SIZE && (strcmp(extension_start, ".exe") == 0 || strcmp(extension_start, ".dll") == 0)) {
    return true;
}

return false;


В данном случае будет сравниваться последние четыре символа строки на совпадение. (Можно использовать 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>А может вам и вовсе без них обойтись? Скажем можно так:

нельзя, только через регексы, долго объяснять почему, нужно найти решение задачи так как она поставлена
Re: Подскажите с регулярным выражением
От: jazzer Россия Skype: enerjazzer
Дата: 23.06.08 02:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет всем.


А>нужно составить регулярное выражение проверка на совпадение которого была бы true если в исходной строке НЕ присутствуют заданные строки.

А>например если в строке не присутствуют .exe и .dll, то подходит

А>Спасибо за помощь.


ну, поскольку ты все равно проверяешь результат матчинга, то его можно просто проверять не на true, а на false
if ( ! re.match(string) ) ...
Но если тебе нужно именно через regex-ы, заюзать negative look-ahead (?!exe|dll) и look-behind (?<!exe|dll). Первый смотрит вперед, последний — назад.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Подскажите с регулярным выражением
От: Gluk_Kazan  
Дата: 23.06.08 03:57
Оценка:
А>нужно составить регулярное выражение проверка на совпадение которого была бы 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)
Re[2]: Подскажите с регулярным выражением
От: Gluk_Kazan  
Дата: 23.06.08 04:00
Оценка:
Здравствуйте, Gluk_Kazan, Вы писали:


$A = 'AAA';
$B = 'BBB';
$Z = 'ZZZ';

$_ = 'DDD AAA FFF BBB ZZZ BBB ZZZ EEE';

if (/$A(?:(?!$Z).)*$B/) {
   print "$&\n";
}


утро реально хмарое
Re[2]: Подскажите с регулярным выражением
От: Аноним  
Дата: 23.06.08 05:48
Оценка:
Здравствуйте, 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
Re[3]: Подскажите с регулярным выражением
От: jazzer Россия Skype: enerjazzer
Дата: 23.06.08 05:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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 — он будет искать именно частичное совпадение.

Кстати, если у тебя всегда строка оканчивается тем, что ты хочешь найти, используй доллар в конце регэкса — будет существенно быстрее искать
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

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).*$
Re[5]: Подскажите с регулярным выражением
От: jazzer Россия Skype: enerjazzer
Дата: 23.06.08 06:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, jazzer, Вы писали:


J>>regex_match требует, чтобы вся строка попадала под регекс, а у тебя только часть попадает.

J>>Так что либо делай полный регекс, либо используй regex_search — он будет искать именно частичное совпадение.

А>что значит полный регекс?


который матчит строку целиком: .*\.(?!exe|dll).*

J>>Кстати, если у тебя всегда строка оканчивается тем, что ты хочешь найти, используй доллар в конце регэкса — будет существенно быстрее искать

А>нет, после анализируемого фргамента еще может быть текст
А>а так быстрее будет? — \.(?!exe|dll).*$
нет, тогда быстрее не будет.
регексы ускоряются, когда можно привязаться к чему-то, что можно быстро сматчить, типа конца строки.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Подскажите с регулярным выражением
От: php-coder Чехия http://slava-semushin.blogspot.com
Дата: 23.06.08 06:27
Оценка:
Здравствуйте, Аноним, Вы писали:

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));
Re[7]: Подскажите с регулярным выражением
От: jazzer Россия Skype: enerjazzer
Дата: 23.06.08 06:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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 пишешь? Или не работает без него?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

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 вернуло, и второй вариант из скобок убрал, хотя мне нужно будет в несколько вариантов
Re[9]: Подскажите с регулярным выражением
От: jazzer Россия Skype: enerjazzer
Дата: 23.06.08 06:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, jazzer, Вы писали:


А>match_default убрал, но

А>test = boost::regex_search ("test.exe", regex ("\.(?!exe)"));
А>опять true вернуло, и второй вариант из скобок убрал, хотя мне нужно будет в несколько вариантов
ну возьми все выражение в скобочки и посмотри, что match_results вернет.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

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 вроде есть такие.

всех благодарю
Re[11]: Подскажите с регулярным выражением
От: siv Украина  
Дата: 23.06.08 11:34
Оценка: 1 (1)
А>не совсем понял в чем причина, но когда исходную строку и регулярное выражение стал не в коде задавать а считывать как будет в конечном итоге с файла все нормально отрабатывалось.

Ну это м.б. банально из-за невнимательности при экранировании обратных слэшей.
Например, в регэксах "\." обозначает "проматчить с точкой", а в си-строке это равносильно просто ".", что для регэкса означает 1 любой символ
Т.е регэкс "\." в си-строках выглядит как "\\."
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.