The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Поиск фразы в строке, !*! z3f, 26-Апр-05, 17:26  [смотреть все]
Есть массив. В каждом элементе массива забиты строки переменной длины.
Выглядят так
      Тип компьютера                                    Advanced Configuration and Power Interface (ACPI) PC
      Операционная система                              Microsoft Windows 2000 Server

это лог евереста для определенного компьютера.
в этих строчках есть небольшая сложность - это различное количесво пробелов между первой фразой - и между второй. а вот количество пробелов от начала строки до первой части - постоянно...
нужно выкорчевать из них вторую часть.
даже ума не приложу как это сделать=(
может кто поможет?

  • Поиск фразы в строке, !*! rWizard, 22:19 , 26-Апр-05 (1)
    может так?
    /\ {5}(\w+\ )+\ {3-60}(\w+\ )+
    • Поиск фразы в строке, !*! mthawk, 02:09 , 27-Апр-05 (2)
      >может так?
      >/\ {5}(\w+\ )+\ {3-60}(\w+\ )+

      или так
      ($shit,$good)=split(/\s{2,}/,$string);

      • Поиск фразы в строке, !*! z3f, 09:57 , 27-Апр-05 (3)
        >>может так?
        >>/\ {5}(\w+\ )+\ {3-60}(\w+\ )+
        >
        >или так
        >($shit,$good)=split(/\s{2,}/,$string);


        $shit - строка на входе
        $good - строка на выходе
        $string - не понял совсем что это...=(
        2, - то же не понял...

        Поясните плз чайнику!

        PS /\ {5}(\w+\ )+\ {3-60}(\w+\ )+ - здесь вообще не понятно.
        что к чему и зачем - облазил все инетовские справочники - ничего не нашел или просто не видел=(

        • Поиск фразы в строке, !*! z3f, 11:48 , 27-Апр-05 (4)
          >>>может так?
          >>>/\ {5}(\w+\ )+\ {3-60}(\w+\ )+
          >>
          >>или так
          >>($shit,$good)=split(/\s{2,}/,$string);
          >
          >
          >$shit - строка на входе
          >$good - строка на выходе
          >$string - не понял совсем что это...=(
          >2, - то же не понял...
          >
          >Поясните плз чайнику!
          >
          >PS /\ {5}(\w+\ )+\ {3-60}(\w+\ )+ - здесь вообще не понятно.
          >что к чему и зачем - облазил все инетовские справочники - ничего
          >не нашел или просто не видел=(

          Короче - не работает=(
          или у меня корявые ручки...
          помогите!

        • Поиск фразы в строке, !*! butcher, 11:59 , 27-Апр-05 (5)
          >>($shit,$good)=split(/\s{2,}/,$string);
          >
          >
          >$shit - строка на входе
          Это первая часть разделённой строки

          >$good - строка на выходе
          Это втоая часть разделённой строки

          >$string - не понял совсем что это...=(
          Это ваша строка, которую нужна разделить.

          >2, - то же не понял...
          Читайте про регулярные выражения, доки рулят..

          • Поиск фразы в строке, !*! z3f, 12:18 , 27-Апр-05 (6)
            Делаю так
            if ($stroka=~/Тип компьютера/) {($shit,$good)=split(/\s{2,}/,$stroka); print OUT $shit;}
            выдает пустоту - то есть пустую строку.

            а если так
            if ($stroka=~/Тип компьютера/) {($shit,$good)=split(/\s{2,}/,$stroka); print OUT $good;}
            выдает первую часть строки... то бишь выдает слова "Тип компьютера".

            я понимаю что ошибка в моем ДНК =) но всё же это - не работает и исправить это я не могу...

            • Поиск фразы в строке, !*! butcher, 12:33 , 27-Апр-05 (7)
              >а если так
              >if ($stroka=~/Тип компьютера/) {($shit,$good)=split(/\s{2,}/,$stroka); print OUT $good;}
              >выдает первую часть строки... то бишь выдает слова "Тип компьютера".

              Добавьте перед этим:
              $stroka =~ /^\s*//;

              Или, альтернативный вариант:
              $stroka =~ /^\s+(.*?)\s{2,}(.*)$/;
              print "$1 -> $2\n";

              • Поиск фразы в строке, !*! PoizOn, 15:21 , 27-Апр-05 (8)
                >>а если так
                >>if ($stroka=~/Тип компьютера/) {($shit,$good)=split(/\s{2,}/,$stroka); print OUT $good;}
                >>выдает первую часть строки... то бишь выдает слова "Тип компьютера".
                >
                >Добавьте перед этим:
                >$stroka =~ /^\s*//;
                >
                >Или, альтернативный вариант:
                >$stroka =~ /^\s+(.*?)\s{2,}(.*)$/;
                >print "$1 -> $2\n";
                ИМХО лучший вариант для обработки подобных данных не такой.
                Сперва обработайте массив и приведите его к более правильной структуре: то есть. Берем ваш массив, и начинаем итерацию по каждому элементу,

                for($i=0;$i<@MASSIV;$i++) {

                $MASSIV[$i]=~s/\s{2,}/|/g;# заменяем более 2 пробелов на какой-либо символ (к примеру |)
                }

                После такой обработки, элемент будет содержать уже более "удобную" строку: типа:

                Слово слово|слово слово слово|

                Теперь достаточно сплитить строку по символу |, и вынуть все необходимые элементы:

                for($i=0;$i<@MASSIV;$i++) {

                ($first,$second)=split(/|/,$MASSIV[$i]);
                }

                ЗЫ. Непомню нужно ли экранировать |, по моему нет.

                • Поиск фразы в строке, !*! z3f, 16:52 , 27-Апр-05 (9)
                  Спасибо всем большое - всё работает!
                • Поиск фразы в строке, !*! MTHawk, 22:58 , 27-Апр-05 (10)
                  >>>а если так
                  >>>if ($stroka=~/Тип компьютера/) {($shit,$good)=split(/\s{2,}/,$stroka); print OUT $good;}
                  >>>выдает первую часть строки... то бишь выдает слова "Тип компьютера".
                  >>
                  >>Добавьте перед этим:
                  >>$stroka =~ /^\s*//;
                  >>
                  >>Или, альтернативный вариант:
                  >>$stroka =~ /^\s+(.*?)\s{2,}(.*)$/;
                  >>print "$1 -> $2\n";
                  >ИМХО лучший вариант для обработки подобных данных не такой.
                  >Сперва обработайте массив и приведите его к более правильной структуре: то есть.
                  >Берем ваш массив, и начинаем итерацию по каждому элементу,
                  >
                  >for($i=0;$i<@MASSIV;$i++) {
                  >
                  >$MASSIV[$i]=~s/\s{2,}/|/g;# заменяем более 2 пробелов на какой-либо символ (к примеру |)
                  >}
                  >
                  >После такой обработки, элемент будет содержать уже более "удобную" строку: типа:
                  >
                  >Слово слово|слово слово слово|
                  >
                  >Теперь достаточно сплитить строку по символу |, и вынуть все необходимые элементы:
                  >
                  >
                  >for($i=0;$i<@MASSIV;$i++) {
                  >
                  >($first,$second)=split(/|/,$MASSIV[$i]);
                  >}
                  >
                  >ЗЫ. Непомню нужно ли экранировать |, по моему нет.


                  Скажите, а чем $MASSIV[$i]=~s/\s{2,}/|/g с точки зрения регекспа отличается от ($first,$second)=split(/\s{2,}/,$string); ??
                  Мне кажется просто лишнее нагромождение кода, хотя это лишь мое мнение.

                  • Поиск фразы в строке, !*! madskull, 23:31 , 27-Апр-05 (11)

                    >Скажите, а чем $MASSIV[$i]=~s/\s{2,}/|/g с точки зрения регекспа отличается от ($first,$second)=split(/\s{2,}/,$string); ??
                    >
                    >Мне кажется просто лишнее нагромождение кода, хотя это лишь мое мнение.

                    А зачем создавать неиспользуемые переменные?

                    Можно все свести примерно к следующему (если исходные строки в MASSIV'е):
                    s/^.+?\s{2,}// for @MASSIV;

                    (если я правильно понял задачу...)

                    • Поиск фразы в строке, !*! z3f, 16:25 , 29-Апр-05 (12)
                      >А зачем создавать неиспользуемые переменные?
                      >
                      >Можно все свести примерно к следующему (если исходные строки в MASSIV'е):
                      >s/^.+?\s{2,}// for @MASSIV;
                      >
                      >(если я правильно понял задачу...)

                      Вы правильно поняли задачу - но это-то просто и понятно...
                      вот следующую задачу я никак не могу осилисть -хотя она и простая.
                      есть строка. в этой строке в произвольном месте есть тэг <td>. после тэга идет фраза она замыкается тэгом </a>. дальше еще идет фраза.
                      то етсь где то посредине строки есть фраза обрамленная тэгами <td> и </a>.
                      нужно получить эту фразу.
                      как это сделать?
                      найти номер позиции с которой есть эта фраза не проблема, номер позиции с котрой начинается тэг </a> то же не проблема - но как выдернуть фразу?

                      • Поиск фразы в строке, !*! z3f, 16:52 , 29-Апр-05 (13)
                        Задачу выставленную в предыдущем вопросе в принципе решил...
                        думаю что коряво=(
                        посмотрите этот с позволения сказать код

                        chop($f[$m+1],$f[$m+2],$f[$m+3]);

                        $loc1=index(($f[$m+1].$f[$m+2].$f[$m+3]), "<TD>");

                        $loc2=index (($f[$m+1].$f[$m+2].$f[$m+3]),"</A>");

                        $hh=substr(($f[$m+1].$f[$m+2].$f[$m+3]),$loc1,$loc2+4);

                        print "$hh \n";

                        Може ткто предложит более изящное решение?
                        а то я как то в регулярных выражениях - пас=(

                        • Поиск фразы в строке, !*! madskull, 23:00 , 29-Апр-05 (14)
                          >Задачу выставленную в предыдущем вопросе в принципе решил...
                          >думаю что коряво=(
                          >посмотрите этот с позволения сказать код
                          >
                          >chop($f[$m+1],$f[$m+2],$f[$m+3]);
                          >
                          >$loc1=index(($f[$m+1].$f[$m+2].$f[$m+3]), "<TD>");
                          >
                          >$loc2=index (($f[$m+1].$f[$m+2].$f[$m+3]),"</A>");
                          >
                          >$hh=substr(($f[$m+1].$f[$m+2].$f[$m+3]),$loc1,$loc2+4);
                          >
                          >print "$hh \n";
                          >
                          Как тут любят говорить некоторые - фтопку :)
                          Некрасиво и не по "перловому".

                          >Може ткто предложит более изящное решение?
                          >а то я как то в регулярных выражениях - пас=(
                          А вот это зря. СтОит потратить день на изучение регекспов и жизнь будет намного проще :)

                          Что такое $f[$m+1].$f[$m+2].$f[$m+3]?
                          Получение строки, в которой искать?

                          ($hh) = join("",@f[$m+1..$m+3]) =~ m#<TD>(.+?)</A>#;
                          print "$hh \n";




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру