![]() |
|
IT и Связь Обсуждение "айтишных" вопросов и средств связи |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Активный Участник
|
![]()
Привет!
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 молчит как мёртвый, и тока повторяет !~ !~ !~ |
![]() |
![]() |
Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок |
![]() |
#3 | |
Активный Участник
|
![]() Цитата:
"^[^us]{2}\..+" выкинет как "uk" так и "se". И так тоже не будет работать: "^[^u][^s]\..+", опять же выкинет всё что начинается на u. Нужно именно "!(^us\..+)", тока по Perlовски. Последний раз редактировалось вЫлЫсЫпЫдЫстЫ, 19.03.2009 в 21:47. |
|
![]() |
![]() |
![]() |
#4 |
Заслуженный Участник
|
![]()
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. |
![]() |
![]() |
![]() |
#5 |
Practical UNIX Terrorist
|
![]()
> Как сказать "все КРОМЕ ^us\..+"?
/^(?!us\.)./ гуглить: negative look behind assertions
__________________
Even if a billion people believe something it can still be ridiculous. |
![]() |
![]() |
Благодарностей: 3 от: |
![]() |
#7 |
Practical UNIX Terrorist
|
![]()
справедливости ради надо отметить, что пхп тоже поддерживает такой синтаксис, равно как и любой продукт использующий либу pcre.
но pcre - это ж таки perl-compatible regular expressions, так что perl - всему голова, да ![]()
__________________
Even if a billion people believe something it can still be ridiculous. |
![]() |
![]() |
![]() |
#8 | |
Заслуженный Участник
|
![]()
Как в перле я хз, но думаю такое сможешь переделать в перл сам:
Цитата:
|
|
![]() |
![]() |
![]() |
#9 |
Practical UNIX Terrorist
|
![]()
Epo> первый символ может быть какой угодно, затем идёт любой символ кроме "s"
как насчёт испанцев (es)? пошто их, бедных, под один веник с американцами?
__________________
Even if a billion people believe something it can still be ridiculous. |
![]() |
![]() |
![]() |
#10 | |
Спам-робот
|
![]() Цитата:
^(?!$var\.)./ |
|
![]() |
![]() |
![]() |
#11 |
Заслуженный Участник
|
![]() |
![]() |
![]() |
![]() |
#12 |
Practical UNIX Terrorist
|
![]()
vc> ^(?!$var\.)./
не забываем про \Q ... \E (если только ты не хотел чтоб $var интерпретировалась как регекс).
__________________
Even if a billion people believe something it can still be ridiculous. |
![]() |
![]() |
![]() |
#13 |
Спам-робот
|
![]()
Я хотел, чтобы перед выполнением regex "скомпилировался", т.е. строчка $var превратилась в "us"
![]() |
![]() |
![]() |
Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок |
![]() |
#14 |
Practical UNIX Terrorist
|
![]()
да, но при интерполяции переменных внутри регекса всегда нужно думать - а хочу ли я чтобы содержимое переменной интерпретировалось как регекс?
то есть, грубо говоря, если $var = '.*', то чтоб оно матчило любое число чего угодно, либо только дословно строку .* для второго варианта (что обычно и требуется) придуманы \Q...\E: /^(?!\Q$var\E\.)./
__________________
Even if a billion people believe something it can still be ridiculous. |
![]() |
![]() |
![]() |
Ключевые слова |
negation, perl, regex |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщ. |
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 |