На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
  
    > PCRE ...
      Не знаю правильно ли я пихнул свой вопрос, но ближе по теме раздела, по-моему, нет (по крайней мере PERL ведь указан)... Смысл в том, что пытаюсь использовать библиотеку
      PCRE для собственных нужд ... Вопрос такой:
      Почему при поиске, например, в строке:
      ExpandedWrap disabled
         
        "_enumeration_{_alias_{viewcursor}_groupby_{†81146580†}_cursor_{newcursor}_separator_{','+chr(13)}_calculate_{_alias_{viewcursor}_format_{9,999}cnt()}+[ шт.(компл.)]}"

      по шаблону
      ExpandedWrap disabled
         
        "_([a-zA-Z]+)_\\{.*\\}"

      получаю всего два варианта (найденных совпадения):
      а) все выражение (это понятно)
      б) "enumeration" (это тоже понятно) ?... Ощущение такое будто бы стоит символ '^' - искомое выражение должно находиться в начале строки ...
      Мне же надо, чтобы были вытащены все строки типа "_*_{*}" (синтаксис - как поиск файла по шаблону) и то, что в шаблоне в скобках () ...
      Поможите кто чем могёт, а то :wall: - это про меня ...

      ЗЫ Опции преобразования в pcre_compile - PCRE_CASELESS | PCRE_MULTILINE ... в Pcre_Exec - PCRE_NOTEMPTY ...
        Цитата
        _*_{*}
        Такого типа?
        А по
        Цитата
        "_([a-zA-Z]+)_\\{.*\\}"
        понятно, что такого:
        ExpandedWrap disabled
          _([a-zA-Z]+)_\{.*\}


        Пиши, если правильно понял,:
        ExpandedWrap disabled
          "_(.*)_\\{(.*)\\}"
          Hi ...
          2Tishaishii
          Цитата

          понятно, что такого:
          _([a-zA-Z]+)_\{.*\}

          Ну ... да ... Т.е. \\ - это из С++ - т.е. двойной флеш - это чтоб компилятор понял ... что в строке есть флеш ...
          Цитата

          "_(.*)_\\{(.*)\\}"

          - стало еще хуже: возвращает два найденных совпадения, оба - вся строка целиком .... По идее синтаксис "[a-zA-Z]+" более правильный,
          т.к. в управляющих конструкциях типа _*_{} под звездочкой - только символы латинского алфавита ...
          Уточню проблему ... Мне надо, чтобы из строки вида, например:
          ExpandedWrap disabled
             
            _enumeration_{_alias_{viewcursor}_groupby_{†81146580†}_cursor_{newcursor}_separator_{','+chr(13)}_calculate_{_alias_{viewcursor}_format_{9,999}cnt()}+[
              шт.(компл.)]}

          были вытащены как минимум все конструкции типа "_*_{*}", т.е. в том числе
          ExpandedWrap disabled
             
            и _alias_{viewcursor}, и _groupby_{†81146580†}, и _cursor_{newcursor}, и _calculate_{_alias_{viewcursor}_format_{9,999}cnt()} и т.д. и т.п. ...

          Можно ли такое сделать одним шаблоном и без цикла ... Хотя непонятно и как в цикле это сделать ... разве что "вырезая" найденные строки?...
            В Perl я сделал бы так:
            ExpandedWrap disabled
              local$ereg=qr'_(.*?)_\{([^\}]*)\}';
              local%hash=($str=~m[$ereg]go);

            $str - это строка, в которой искать.
            Да, и что такое "Более правильный синтаксис"? Не программа строит тебя, а ты программу.
            Можно даже в поговрки народные записать.
              Hi ...
              Цитата

              Можно даже в поговрки народные записать.

              Да ради бога ... :) Я имел ввиду что ошибочные конструкциии, типа буквенно-цифровые, например, нужно исключать ...
              Попробовал
              Цитата

              '_(.*?)_\{([^\}]*)\}'

              результат - 3 найденных совпадения:
              а)"_enumeration_{_alias_{viewcursor}"
              б)"enumeration"
              в)"_alias_{viewcursor" ...
              Хм ... Понимаю только, что ничего не понимаю ... Что может может означать, например, данный шаблон
              Цитата

              [^\}]*

              По моему, ламерскому, разумению - "любой символ из перечисленных в скобках повторяется 0 и более раз" !... Ну и что?!!!... Но ведь как-то работает!!
              Совсем запутался ...
              А есть ли возможность указать исключения?... Например: "любой символ, исключая }"?...
              В любом случае спасибо за внимание ...
                Таак.
                Уж не знаю, что не получается. По-моему понятно:

                [набор_символов] - указывает на существование одного символа из "набор_символов".
                [^набор_символов] - указывает на существование одного символа НЕ из "набор_символов".
                * - <=1 набор символов или символ
                + - >=1 набор символов или символ

                ExpandedWrap disabled
                  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;


                Вывод:
                ExpandedWrap disabled
                  calculate   _alias_{viewcursor
                  cursor  newcursor
                  enumeration _alias_{viewcursor
                  format  9,999
                  groupby †81146580†
                  separator   ','+chr(13)


                Очень даже логично.
                  Hi
                  Очевидно, работает по-разному в PERL и в библиотеке PCRE (цитата: "поддержка Perl'овых регулярных выражений ") :( ...
                  Попробовал скомпилить другую библиотеку, т.н. PCREPOSIX (позиционируется как "Они поддерживают малое количество возможностей и созданы лишь для совместимости со стандартными" (PERL-а надо понимать)) и прогнать через ее функции - результат тот же :(...
                  Буду пробовать дальше ... т.к. некоторые товарищи утверждают, что решить данную задачу с помощью PCRE однозначно можно (и нужно), надо лишь правильно составить регулярное выражение ...
                  О результатах всенепременно сообщу ... (хотя, скорее всего, я не раз подниму эту тему по ходу дела :))
                    Регулярные выражения в Perl отличны от стандартных POSIX
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0658 ]   [ 16 queries used ]   [ Generated: 19.04.24, 01:19 GMT ]