Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.138.214] |
|
Сообщ.
#1
,
|
|
|
Не знаю правильно ли я пихнул свой вопрос, но ближе по теме раздела, по-моему, нет (по крайней мере PERL ведь указан)... Смысл в том, что пытаюсь использовать библиотеку
PCRE для собственных нужд ... Вопрос такой: Почему при поиске, например, в строке: "_enumeration_{_alias_{viewcursor}_groupby_{†81146580†}_cursor_{newcursor}_separator_{','+chr(13)}_calculate_{_alias_{viewcursor}_format_{9,999}cnt()}+[ шт.(компл.)]}" по шаблону "_([a-zA-Z]+)_\\{.*\\}" получаю всего два варианта (найденных совпадения): а) все выражение (это понятно) б) "enumeration" (это тоже понятно) ?... Ощущение такое будто бы стоит символ '^' - искомое выражение должно находиться в начале строки ... Мне же надо, чтобы были вытащены все строки типа "_*_{*}" (синтаксис - как поиск файла по шаблону) и то, что в шаблоне в скобках () ... Поможите кто чем могёт, а то - это про меня ... ЗЫ Опции преобразования в pcre_compile - PCRE_CASELESS | PCRE_MULTILINE ... в Pcre_Exec - PCRE_NOTEMPTY ... |
Сообщ.
#2
,
|
|
|
Цитата Такого типа?_*_{*} А по Цитата понятно, что такого:"_([a-zA-Z]+)_\\{.*\\}" _([a-zA-Z]+)_\{.*\} Пиши, если правильно понял,: "_(.*)_\\{(.*)\\}" |
Сообщ.
#3
,
|
|
|
Hi ...
2Tishaishii Цитата понятно, что такого: _([a-zA-Z]+)_\{.*\} Ну ... да ... Т.е. \\ - это из С++ - т.е. двойной флеш - это чтоб компилятор понял ... что в строке есть флеш ... Цитата "_(.*)_\\{(.*)\\}" - стало еще хуже: возвращает два найденных совпадения, оба - вся строка целиком .... По идее синтаксис "[a-zA-Z]+" более правильный, т.к. в управляющих конструкциях типа _*_{} под звездочкой - только символы латинского алфавита ... Уточню проблему ... Мне надо, чтобы из строки вида, например: _enumeration_{_alias_{viewcursor}_groupby_{†81146580†}_cursor_{newcursor}_separator_{','+chr(13)}_calculate_{_alias_{viewcursor}_format_{9,999}cnt()}+[ шт.(компл.)]} были вытащены как минимум все конструкции типа "_*_{*}", т.е. в том числе и _alias_{viewcursor}, и _groupby_{†81146580†}, и _cursor_{newcursor}, и _calculate_{_alias_{viewcursor}_format_{9,999}cnt()} и т.д. и т.п. ... Можно ли такое сделать одним шаблоном и без цикла ... Хотя непонятно и как в цикле это сделать ... разве что "вырезая" найденные строки?... |
Сообщ.
#4
,
|
|
|
В Perl я сделал бы так:
local$ereg=qr'_(.*?)_\{([^\}]*)\}'; local%hash=($str=~m[$ereg]go); $str - это строка, в которой искать. Да, и что такое "Более правильный синтаксис"? Не программа строит тебя, а ты программу. Можно даже в поговрки народные записать. |
Сообщ.
#5
,
|
|
|
Hi ...
Цитата Можно даже в поговрки народные записать. Да ради бога ... Я имел ввиду что ошибочные конструкциии, типа буквенно-цифровые, например, нужно исключать ... Попробовал Цитата '_(.*?)_\{([^\}]*)\}' результат - 3 найденных совпадения: а)"_enumeration_{_alias_{viewcursor}" б)"enumeration" в)"_alias_{viewcursor" ... Хм ... Понимаю только, что ничего не понимаю ... Что может может означать, например, данный шаблон Цитата [^\}]* По моему, ламерскому, разумению - "любой символ из перечисленных в скобках повторяется 0 и более раз" !... Ну и что?!!!... Но ведь как-то работает!! Совсем запутался ... А есть ли возможность указать исключения?... Например: "любой символ, исключая }"?... В любом случае спасибо за внимание ... |
Сообщ.
#6
,
|
|
|
Таак.
Уж не знаю, что не получается. По-моему понятно: [набор_символов] - указывает на существование одного символа из "набор_символов". [^набор_символов] - указывает на существование одного символа НЕ из "набор_символов". * - <=1 набор символов или символ + - >=1 набор символов или символ local$str=q|_enumeration_{_alias_{viewcursor}_groupby_{†81146580†}_cursor_{newcursor}_separator_{','+chr(13)}_calculate_{_alias_{viewcursor}_format_{9,999}cnt()}+[ шт.(компл.)]}|; local%hash=$str=~/_(.*?)_\{([^\}]*)\}/go; map{print $_,"\t",delete$hash{$_},"\n"}sort keys%hash; Вывод: calculate _alias_{viewcursor cursor newcursor enumeration _alias_{viewcursor format 9,999 groupby †81146580† separator ','+chr(13) Очень даже логично. |
Сообщ.
#7
,
|
|
|
Hi
Очевидно, работает по-разному в PERL и в библиотеке PCRE (цитата: "поддержка Perl'овых регулярных выражений ") ... Попробовал скомпилить другую библиотеку, т.н. PCREPOSIX (позиционируется как "Они поддерживают малое количество возможностей и созданы лишь для совместимости со стандартными" (PERL-а надо понимать)) и прогнать через ее функции - результат тот же ... Буду пробовать дальше ... т.к. некоторые товарищи утверждают, что решить данную задачу с помощью PCRE однозначно можно (и нужно), надо лишь правильно составить регулярное выражение ... О результатах всенепременно сообщу ... (хотя, скорее всего, я не раз подниму эту тему по ходу дела ) |
Сообщ.
#8
,
|
|
|
Регулярные выражения в Perl отличны от стандартных POSIX
|