The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Поиск фразы в строке"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

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

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

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Поиск фразы в строке" 
Сообщение от rWizard emailИскать по авторуВ закладки(ok) on 26-Апр-05, 22:19  (MSK)
может так?
/\ {5}(\w+\ )+\ {3-60}(\w+\ )+
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Поиск фразы в строке" 
Сообщение от mthawk emailИскать по авторуВ закладки(??) on 27-Апр-05, 02:09  (MSK)
>может так?
>/\ {5}(\w+\ )+\ {3-60}(\w+\ )+

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Поиск фразы в строке" 
Сообщение от z3f emailИскать по авторуВ закладки(ok) on 27-Апр-05, 09:57  (MSK)
>>может так?
>>/\ {5}(\w+\ )+\ {3-60}(\w+\ )+
>
>или так
>($shit,$good)=split(/\s{2,}/,$string);


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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Поиск фразы в строке" 
Сообщение от PoizOn emailИскать по авторуВ закладки(ok) on 27-Апр-05, 15:21  (MSK)
>>а если так
>>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]);
}

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Поиск фразы в строке" 
Сообщение от z3f emailИскать по авторуВ закладки(??) on 27-Апр-05, 16:52  (MSK)
Спасибо всем большое - всё работает!
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "Поиск фразы в строке" 
Сообщение от MTHawk emailИскать по авторуВ закладки(??) on 27-Апр-05, 22:58  (MSK)
>>>а если так
>>>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); ??
Мне кажется просто лишнее нагромождение кода, хотя это лишь мое мнение.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "Поиск фразы в строке" 
Сообщение от madskull Искать по авторуВ закладки(ok) on 27-Апр-05, 23:31  (MSK)

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

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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";

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

14. "Поиск фразы в строке" 
Сообщение от madskull Искать по авторуВ закладки(ok) on 29-Апр-05, 23:00  (MSK)
>Задачу выставленную в предыдущем вопросе в принципе решил...
>думаю что коряво=(
>посмотрите этот с позволения сказать код
>
>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";

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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