URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4216
[ Назад ]

Исходное сообщение
"Поиск фразы в строке"

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

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


Содержание

Сообщения в этом обсуждении
"Поиск фразы в строке"
Отправлено rWizard , 26-Апр-05 22:19 
может так?
/\ {5}(\w+\ )+\ {3-60}(\w+\ )+

"Поиск фразы в строке"
Отправлено mthawk , 27-Апр-05 02:09 
>может так?
>/\ {5}(\w+\ )+\ {3-60}(\w+\ )+

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


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


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

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

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


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

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


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

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

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

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


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

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

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


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

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

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


"Поиск фразы в строке"
Отправлено PoizOn , 27-Апр-05 15:21 
>>а если так
>>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 , 27-Апр-05 16:52 
Спасибо всем большое - всё работает!

"Поиск фразы в строке"
Отправлено MTHawk , 27-Апр-05 22:58 
>>>а если так
>>>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 , 27-Апр-05 23:31 

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

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

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

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


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

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


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

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 , 29-Апр-05 23:00 
>Задачу выставленную в предыдущем вопросе в принципе решил...
>думаю что коряво=(
>посмотрите этот с позволения сказать код
>
>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";