Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> регулярные выражения, удалить 3 и более слова 
:(
    Опции темы
alyam
Дата 23.8.2007, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



есть переменная, примерно выглядит так:
$str="слово1 слово2 слово3"
слов может быть много разных

нужно оставить только первых два.
делаю так:
$str=~/^((.*?)\s(.*?)\s)/
дальше работаю с переменной $1

а есть ли способ пооптимальней?

PM MAIL   Вверх
amg
Дата 23.8.2007, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Нежадный мультипликатор (который со знаком вопроса) - это неэффективно. Лучше так:
Код

$str=~/^(\S+)\s+(\S+)\s/; # $str не изменится, в $1 и $2 будут первое и второе слова.
$str=~/^(\S+\s+\S+)\s/; # в $1 будут первые два слова вместе с пробелами между ними.

Если же нужно изменить $str, оставив только первые два слова, то
Код

$str =~ s/^(\S+\s+\S+).*/$1/; # один вариант
$str = join ' ', (split ' ', $str)[0..1]; # другой вариант


Это сообщение отредактировал(а) amg - 23.8.2007, 09:21
PM MAIL   Вверх
Nab
Дата 23.8.2007, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



alyam, не понятен вопрос, что нужно удалить а что оставить...
Дайте пример с большим количеством слов.

Добавлено через 8 минут и 25 секунд
Код

/^((\S+\s*){2})/



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
nitr
Дата 23.8.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



используя ответ, и как я понял вопрос, то

Код

#!/usr/bin/perl
use strict;
use warnings;

my $str = 'slovo1 slovo2 slovo3 slovo4 slovo5';
$str =~ s/^((\S+\s+){2}).*/$1/;
print $str;

Цитата

E:\>1.pl
slovo1 slovo2



--------------------
PM   Вверх
Nab
Дата 23.8.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Хехе, nitr, а на двух словах не сработает, а если больше, то захватит минимум один пробел в конце... а оно надо?



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 23.8.2007, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Хехе, чтобы пробелы между 2-м и 3-м словами не захватывались, нужен третий вариант
Код

/^((\S+\s*?){2})/

PM MAIL   Вверх
nitr
Дата 23.8.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



а это уже иное smile ...
человек пускай сначала все уточнит, а то "пальцем в небо"

Добавлено через 1 минуту и 46 секунд
nitr, amg подправил ;)

Добавлено через 3 минуты и 21 секунду
или жестко:
Код

#!/usr/bin/perl
use strict;
use warnings;

my $str = 'slovo1 slovo2 slovo3 slovo4 slovo5';
$str =~ s/^(\S+\s+\S+).*/$1/;
print $str;

;)


--------------------
PM   Вверх
alyam
Дата 23.8.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



а если одно слово? слов может быть от 1 до infinity
захватывать пробел в конце не нужно.
я потом объединяю эти слова через точку  join('.',split(/ /,$str)) 
может можно сразу в split задать размер массива?

Это сообщение отредактировал(а) alyam - 23.8.2007, 13:53
PM MAIL   Вверх
amg
Дата 23.8.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(alyam @  23.8.2007,  13:51 Найти цитируемый пост)
может можно сразу в split задать размер массива?
Конечно можно:
Код

$str = join '.',(split ' ',$str)[0,1];
Но если в строке всего одно слово, то перл будет ругаться. А чтобы не ругался, надо фильтр добавить:
Код

$str = join '.', grep { defined } (split ' ',$str)[0,1];

Но бы сделал так, если нужно всего два слова:
Код

$str =~ s/^(\S+)\s+(\S+).*/$1.$2/;
При этом, если в строке всего одно слово, то регулярное выражение не подойдет и строка просто останется неизмененной.



Это сообщение отредактировал(а) amg - 23.8.2007, 15:10
PM MAIL   Вверх
nitr
Дата 24.8.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Цитата(amg @  23.8.2007,  15:00 Найти цитируемый пост)
При этом, если в строке всего одно слово, то регулярное выражение не подойдет и строка просто останется неизмененной.

Вот именно!! Истину говоришь ;)

alyam, вы вообще читаете ответы? smile или только последний smile) Вы пробуйте их тестировать, если в голове не прокручивается.

И еще раз!!! Если будете так задавать вопросы, вам вообще никто не ответит...


--------------------
PM   Вверх
amg
Дата 24.8.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(nitr @  24.8.2007,  13:45 Найти цитируемый пост)
Если будете так задавать вопросы, вам вообще никто не ответит...
Ну уж прямо так... Я, например, частенько отвечаю и на не очень внятные или неинтересные вопросы, просто стараюсь сделать это так, чтобы вызвать ответный поучительный флейм со стороны кого-нибудь типа тебя или других знатоков.

PM MAIL   Вверх
nitr
Дата 24.8.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



amg, это понятно, но у него конкретная задачка, а твои "иные", больше похожи на "перл-гольф"/JAPH smile короче "местные извращения с перл ;)", но поучительные в большинстве своем smile

Я уже описал, как данный топик называется - "пальцем в небо". Т.к. раздуваем простейшую регулярку...


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0882 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.