Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как заэкранировать все символы в переменной, которая будет использоваться в регексе? 
:(
    Опции темы
Suppir
Дата 15.3.2011, 09:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



В регулярном выражении использую переменную:

if (/$exceptions/){}

где $exceptions = "исключение1|исключение2|исключение3|..."

Исключения представляют собой обычные строки вида:

"Расчет максимального среднего дневного заработка для исчисления пособий по временной нетрудоспособности"
"Независимо от места прохождения военной службы по контракту (на территории России или за ее пределами)"
"Размер единовременного пособия при рождении ребенка проиндексирован в соответствии со статьей 4.2"

Каким образом можно заэкранировать все символы в исключениях, которые могут интерпретироваться как метасимволы в регулярном выражении? 
Например, во втором исключении есть скобки, необходимо перед каждой скобкой поставить \(. 
Также могут встречать другие метасимволы:  [] ?, +, . , >, < и т.д. 
Существует ли надежный способ экранирования?


PM MAIL   Вверх
arto
Дата 15.3.2011, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc perlre на предмет Escape sequences
PM MAIL ICQ   Вверх
Suppir
Дата 15.3.2011, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



В общем, готового решения нет?


Еще один момент. У меня следующее регулярное выражение:


Код

    $doc =~ s/
            (^-{66}\n)
                (?:     
                    (?:^
                        (?!
                            (?:
                                [\d¦(]
                                |[а-яa-b]\)
                                |[^"]{1,13}[XХVI\d]\.\h
                                |.+\h\(далее\h?-
                                |можно ли в этом месте перебрать все ключи из хеша или массива?
                            )
                        ).{20,}\n
                        |^\n
                    )+\1
                )+
                (?{$c++; print COM "$&\n"})
            //mgx;

PM MAIL   Вверх
arto
Дата 15.3.2011, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



смотря что понимать под "готовым решением".

непонятен глагол "перебрать"
PM MAIL ICQ   Вверх
sir_nuf_nuf
Дата 15.3.2011, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



есть варианты:
Код

my $var = 'a*b+';
my $re1 = qr/\Q$var\E/;   - не безопасно.. в $var может быть \E
my $var2 = quotemeta($var);
my $re2 = qr/$var2/; - это по идее лучше



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
arto
Дата 15.3.2011, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



не влияет:
# print -l "aa" "bb" "cc" "dd" | perl -lne '$a = "aa|bb\\E|cc"; print "$_: ",(m#$a# ? "yes" : "no")'
aa: yes
bb: no
cc: yes
dd: no
# print -l "aa" "bb" "cc" "dd" | perl -lne '$a = "aa|bb\\E|cc"; print "$_: ",(m#\Q$a\E# ? "yes" : "no")'
aa: no
bb: no
cc: no
dd: no
# print -l "aa" "bb" "cc" "dd" | perl -lne '$a = "aa|bb\\E|cc"; print "$_: ",(m#\Q$a\E|dd# ? "yes" : "no")'
aa: no
bb: no
cc: no
dd: yes

PM MAIL ICQ   Вверх
Suppir
Дата 15.3.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Цитата(arto @  15.3.2011,  10:41 Найти цитируемый пост)
непонятен глагол "перебрать" 


допустим, есть хеш с ключами вида

исключение1
исключение2
исключение3


я хочу вставить эти исключения в регулярное выражение 
Код

 $doc =~ s/
            (^-{66}\n)
                (?:     
                    (?:^
                        (?!
                            (?:
                                [\d¦(]
                                |[а-яa-b]\)
                                |[^"]{1,13}[XХVI\d]\.\h
                                |.+\h\(далее\h?-
                                |исключение1
                                |исключение2
                                |исключение3
                            )
                        ).{20,}\n
                        |^\n
                    )+\1
                )+
                (?{$c++; print COM "$&\n"})
            //mgx;





Если исключений мало, то можно просто склеить все строки в одну переменную: $var = "исключение1|исключение2|исключение3". Но если этих исключений больше сотни, то скорость регулярного выражения сильно упадет. Существует ли возможность проверки из регулярного выражения на наличие совпавшего куска в хеше?
Например, мы захватили фрагмент в переменную (.+), а теперь нужно сделать проверку вроде if (exists $exceptions{$1}){do_smth()}

PM MAIL   Вверх
arto
Дата 15.3.2011, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc perlre на предмет "(??{ code })", может поможет
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.