VirtualIreland.ru - Виртуальная Ирландия
Вернуться   VirtualIreland.ru - Виртуальная Ирландия > Живем в Ирландии > IT и Связь

IT и Связь Обсуждение "айтишных" вопросов и средств связи

Ответ
 
Опции темы Опции просмотра
Старый 19.03.2009, 20:49   #1
Активный Участник
 
Откуда: жыву Dublin, приехал из Estland, Таллиннград
Сообщений: 248
Благодарности: 90 в 67 сообщениях Поиск благодарностей вЫлЫсЫпЫдЫстЫ
По умолчанию Perl RegEx и pattern negation

Привет!

Perl эксперты, прошу помоши.

Столкнулся с постоянно встречаюшейся проблемой исключения значений используя регулярные выражения в Perl.

Простой пример навскидку.
Есть массив со строчными значениями:

us.chicago
us.losAngeles
us.newYork
uk.london
ie.dublin
ie.cork
ee.tallinn
ru.moscow

Надо выдернуть все КРОМЕ Америки, например.

Вот тут как раз загвоздка. В Perlе нет эквивалентного PHPшному "!" (negation).
Другая проблема что представленное выражение должно быть как параметр в настройке программы, т.е. манипуляции с "!~" никак НЕ подходят:

useRegEx = REGEX[.+] (значение по defaultу - всё)

Все становится ещё интереснее, т.к. negative lookbehind работает ТОЛьКО с fixed length.

Из Perl документации:
(?<!pattern) A zero-width negative lookbehind assertion. For example /(?<!bar)foo/ matches any occurrence of "foo'' that isn't following "bar''. Works only for fixed-width lookbehind.
http://www.perl.com/doc/manual/html/pod/perlre.html

Как быть?
Как сказать "все КРОМЕ ^us\..+"?

Заранее благодарю за любую помошь!

P.S. Google молчит как мёртвый, и тока повторяет !~ !~ !~
вЫлЫсЫпЫдЫстЫ вне форума   Ответить с цитированием

Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок
Старый 19.03.2009, 21:09   #2
Заслуженный Участник
 
Аватар для Zoyka
 
Откуда: Lemberg-Dublin
Сообщений: 1,019
Благодарности: 639 в 270 сообщениях Поиск благодарностей Zoyka
По умолчанию Re: Perl RegEx и pattern negation

так вроде и ест такая функция все кроме например все кроме цифр будет [^0-9] ну и т.д.
Zoyka вне форума   Ответить с цитированием
Благодарность от:
vc (19.03.2009)
Старый 19.03.2009, 21:37   #3
Активный Участник
 
Откуда: жыву Dublin, приехал из Estland, Таллиннград
Сообщений: 248
Благодарности: 90 в 67 сообщениях Поиск благодарностей вЫлЫсЫпЫдЫстЫ
По умолчанию Re: Perl RegEx и pattern negation

Цитата:
Сообщение от Zoyka Посмотреть сообщение
так вроде и ест такая функция все кроме например все кроме цифр будет [^0-9] ну и т.д.
Есть, но она НЕ будет работать т.к. это класс (идёт перебор).
"^[^us]{2}\..+" выкинет как "uk" так и "se".

И так тоже не будет работать:
"^[^u][^s]\..+", опять же выкинет всё что начинается на u.

Нужно именно "!(^us\..+)", тока по Perlовски.

Последний раз редактировалось вЫлЫсЫпЫдЫстЫ, 19.03.2009 в 21:47.
вЫлЫсЫпЫдЫстЫ вне форума   Ответить с цитированием
Старый 19.03.2009, 21:54   #4
Заслуженный Участник
 
Откуда: Менск->Cork->Dublin
Сообщений: 2,239
Благодарности: 1,700 в 822 сообщениях Поиск благодарностей V/B
По умолчанию Re: Perl RegEx и pattern negation

Why use regexp?

Псевдокод с использованием index:
my substr = "us";
open (MYFILE, 'data.txt');
while (<MYFILE>) {
chomp;
if(index($_,substr) < 0){
print "No $substr on this line!";
} else {
print "Got $substr";
}
}
close (MYFILE);
__________________
R.E.M.: It's the end of the world as we know it; I feel fine.
V/B вне форума   Ответить с цитированием
Старый 19.03.2009, 22:12   #5
Practical UNIX Terrorist
 
Аватар для rojer
 
Откуда: bray.ie<-dub.ie<-msk.ru<-ykt.ru
Сообщений: 2,291
Благодарности: 1,257 в 647 сообщениях Поиск благодарностей rojer
По умолчанию Re: Perl RegEx и pattern negation

> Как сказать "все КРОМЕ ^us\..+"?

/^(?!us\.)./

гуглить: negative look behind assertions
__________________
Even if a billion people believe something it can still be ridiculous.
rojer вне форума   Ответить с цитированием
Благодарностей: 3 от:
vadzen (20.03.2009), vc (19.03.2009), вЫлЫсЫпЫдЫстЫ (20.03.2009)
Старый 19.03.2009, 22:18   #6
Спам-робот
 
Аватар для vc
 
Сообщений: 31,257
Благодарности: 21,993 в 10,697 сообщениях Поиск благодарностей vc
По умолчанию Re: Perl RegEx и pattern negation

Php - sucks, Perl - rules!
vc вне форума   Ответить с цитированием
Старый 19.03.2009, 22:21   #7
Practical UNIX Terrorist
 
Аватар для rojer
 
Откуда: bray.ie<-dub.ie<-msk.ru<-ykt.ru
Сообщений: 2,291
Благодарности: 1,257 в 647 сообщениях Поиск благодарностей rojer
По умолчанию Re: Perl RegEx и pattern negation

справедливости ради надо отметить, что пхп тоже поддерживает такой синтаксис, равно как и любой продукт использующий либу pcre.
но pcre - это ж таки perl-compatible regular expressions, так что perl - всему голова, да
__________________
Even if a billion people believe something it can still be ridiculous.
rojer вне форума   Ответить с цитированием
Старый 19.03.2009, 22:26   #8
Заслуженный Участник
 
Аватар для Epo
 
Откуда: Darnassus
Сообщений: 1,449
Благодарности: 689 в 375 сообщениях Поиск благодарностей Epo
По умолчанию Re: Perl RegEx и pattern negation

Как в перле я хз, но думаю такое сможешь переделать в перл сам:
Цитата:
^[a-z][a-rt-z][.][a-zA-Z]{1,}
пойдём от противного, первый символ может быть какой угодно, затем идёт любой символ кроме "s", а далее по твоему тексту, должна быть точка и после название чего то там, чем оно оканчивается не имеет значение, поэтому $ не нужен.
Epo вне форума   Ответить с цитированием
Старый 19.03.2009, 22:36   #9
Practical UNIX Terrorist
 
Аватар для rojer
 
Откуда: bray.ie<-dub.ie<-msk.ru<-ykt.ru
Сообщений: 2,291
Благодарности: 1,257 в 647 сообщениях Поиск благодарностей rojer
По умолчанию Re: Perl RegEx и pattern negation

Epo> первый символ может быть какой угодно, затем идёт любой символ кроме "s"

как насчёт испанцев (es)? пошто их, бедных, под один веник с американцами?
__________________
Even if a billion people believe something it can still be ridiculous.
rojer вне форума   Ответить с цитированием
Старый 19.03.2009, 22:44   #10
Спам-робот
 
Аватар для vc
 
Сообщений: 31,257
Благодарности: 21,993 в 10,697 сообщениях Поиск благодарностей vc
По умолчанию Re: Perl RegEx и pattern negation

Цитата:
Сообщение от Epo Посмотреть сообщение
Как в перле я хз, но думаю такое сможешь переделать в перл сам:

пойдём от противного, первый символ может быть какой угодно, затем идёт любой символ кроме "s", а далее по твоему тексту, должна быть точка и после название чего то там, чем оно оканчивается не имеет значение, поэтому $ не нужен.
Так крутость Перла в том, что там не надо знать заранее страну, по которой фильтровать. Там вообще можно акроним страны в переменную запихнуть (только потом препроцессить это выражение):
^(?!$var\.)./
vc вне форума   Ответить с цитированием
Старый 19.03.2009, 22:53   #11
Заслуженный Участник
 
Аватар для Epo
 
Откуда: Darnassus
Сообщений: 1,449
Благодарности: 689 в 375 сообщениях Поиск благодарностей Epo
По умолчанию Re: Perl RegEx и pattern negation

Цитата:
Сообщение от rojer Посмотреть сообщение
как насчёт испанцев (es)? пошто их, бедных, под один веник с американцами?
__________________
это им за всё хорошее)) а если серьёзно, то нада подумать)
Epo вне форума   Ответить с цитированием
Старый 19.03.2009, 23:02   #12
Practical UNIX Terrorist
 
Аватар для rojer
 
Откуда: bray.ie<-dub.ie<-msk.ru<-ykt.ru
Сообщений: 2,291
Благодарности: 1,257 в 647 сообщениях Поиск благодарностей rojer
По умолчанию Re: Perl RegEx и pattern negation

vc> ^(?!$var\.)./

не забываем про \Q ... \E (если только ты не хотел чтоб $var интерпретировалась как регекс).
__________________
Even if a billion people believe something it can still be ridiculous.
rojer вне форума   Ответить с цитированием
Старый 19.03.2009, 23:14   #13
Спам-робот
 
Аватар для vc
 
Сообщений: 31,257
Благодарности: 21,993 в 10,697 сообщениях Поиск благодарностей vc
По умолчанию Re: Perl RegEx и pattern negation

Я хотел, чтобы перед выполнением regex "скомпилировался", т.е. строчка $var превратилась в "us"
vc вне форума   Ответить с цитированием

Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок
Старый 19.03.2009, 23:21   #14
Practical UNIX Terrorist
 
Аватар для rojer
 
Откуда: bray.ie<-dub.ie<-msk.ru<-ykt.ru
Сообщений: 2,291
Благодарности: 1,257 в 647 сообщениях Поиск благодарностей rojer
По умолчанию Re: Perl RegEx и pattern negation

да, но при интерполяции переменных внутри регекса всегда нужно думать - а хочу ли я чтобы содержимое переменной интерпретировалось как регекс?
то есть, грубо говоря, если $var = '.*', то чтоб оно матчило любое число чего угодно, либо только дословно строку .*
для второго варианта (что обычно и требуется) придуманы \Q...\E:

/^(?!\Q$var\E\.)./
__________________
Even if a billion people believe something it can still be ridiculous.
rojer вне форума   Ответить с цитированием
Старый 19.03.2009, 23:24   #15
Спам-робот
 
Аватар для vc
 
Сообщений: 31,257
Благодарности: 21,993 в 10,697 сообщениях Поиск благодарностей vc
По умолчанию Re: Perl RegEx и pattern negation

А ну это без разницы. Я же сказал "us" (или любая другая страна)
vc вне форума   Ответить с цитированием
Ответ

Ключевые слова
negation, perl, regex



Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать на сообщения
Вы не можете добавлять вложения
Вы не можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщ.
Antique Pattern Library NEV Интересы и Увлечения 3 17.04.2008 18:29
Phone regular expression pattern Skiff IT и Связь 5 20.06.2006 13:20
Книгообмен айтишный (Perl => PHP) KaraNagai IT и Связь 22 13.09.2005 15:19


Часовой пояс GMT, времени сейчас: 10:11.


vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd., Русификация: zCarot, Vovan & Co
©2003-2025 VirtualIreland.ru - Виртуальная Ирландия