Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Регулярное выражение: удаление начальных и конечных пробельных символов (Павел Ш.)
Author Message
Павел Ш.
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Dec 06, 2006 1:28 pm (написано за 1 минуту 23 секунды)
   Post subject: Регулярное выражение: удаление начальных и конечных пробельных символов
Reply with quote

Здравствуйте!
объясните, пожалуйста, почему не работает регулярное выражение s/^\s+(.*)\s+$/$1/s

Спасибо!
Back to top
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 129
   поощрить/наказать


PostPosted: Wed Dec 06, 2006 4:56 pm (спустя 3 часа 28 минут; написано за 39 секунд)
   Post subject:
Reply with quote

Синтаксически это выражение не содержит ошибок. А почему оно не работает в скрипте - зависит от того, как вы его вызываете и что хотите в итоге получить.
Back to top
View user's profile Send private message Send e-mail
Павел Ш.
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Dec 06, 2006 6:19 pm (спустя 1 час 22 минуты; написано за 3 минуты 15 секунд)
   Post subject:
Reply with quote

вызываю очень просто
$txt =~ s/^\s+(.*)\s+$/$1/s;

хочу, чтобы удалялись первые и последние пробельные символы (как и написано в заголовке темы)

т.е. некий аналог следующих комманд:
$txt =~ s/^s+//s;
$txt =~ s/\s+$//s;

но почему то данное регулярное выражение (верхнее) не делает, то, что я хочу

С уважением, Павел.
Back to top
Павел Ш.
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Dec 06, 2006 6:23 pm (спустя 4 минуты; написано за 28 секунд)
   Post subject:
Reply with quote

поправка:

аналог следующих комманд:
$txt =~ s/^\s+//s;
$txt =~ s/\s+$//s;
Back to top
Bolt
Участник форума



Joined: 05 Apr 2003
Posts: 129
Карма: 0
   поощрить/наказать

Location: Киев

PostPosted: Wed Dec 06, 2006 8:03 pm (спустя 1 час 40 минут; написано за 1 минуту)
   Post subject:
Reply with quote

странно.
а что значит
Павел Ш. wrote:
не работает
?
такой код "работает":
Code (any language): скопировать код в буфер обмена
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Wed Dec 06, 2006 9:24 pm (спустя 1 час 21 минуту; написано за 1 минуту 8 секунд)
   Post subject:
Reply with quote

такой работает, а вот такой нет:
Code (perl): скопировать код в буфер обмена
#!/usr/bin/perl
$string = qq (www.perldoc.com/perl5.6/pod/func/qq.html)~

   some text

   ~;
$string =~ s (www.perldoc.com/perl5.6/pod/func/s.html)/^\s (www.perldoc.com/perl5.6/pod/func/s.html)+(.*)\s (www.perldoc.com/perl5.6/pod/func/s.html)+$/$1/s (www.perldoc.com/perl5.6/pod/func/s.html);
print (www.perldoc.com/perl5.6/pod/func/print.html) "\n\n=", $string, "=";
P.S. знак '=' - что бы видеть границы
Back to top
Bolt
Участник форума



Joined: 05 Apr 2003
Posts: 129
Карма: 0
   поощрить/наказать

Location: Киев

PostPosted: Wed Dec 06, 2006 9:45 pm (спустя 21 минуту; написано за 1 минуту 49 секунд)
   Post subject:
Reply with quote

забавно.
Гость wrote:
а вот такой
и не должен работать: регэксп призван убирать "пробелы", но никак не "перенос строки".
Back to top
View user's profile Send private message Send e-mail
Павел Ш.
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Dec 06, 2006 10:38 pm (спустя 52 минуты; написано за 1 минуту 25 секунд)
   Post subject:
Reply with quote

странно, а мне казалось \s в регулярных выражениях включает все пробельные символы, т.е. [ \r\t\n\f]

все таки хотелось узнать почему мой скрипт не работает

С уважением Павел.
Back to top
Павел Ш.
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Dec 06, 2006 10:40 pm (спустя 2 минуты; написано за 1 минуту 22 секунды)
   Post subject:
Reply with quote

кстати результат вышеприведенного скритпа:
Code (any language): скопировать код в буфер обмена
#!/usr/bin/perl
$string = qq~

   some text

   ~;
$string =~ s/^\s+(.*)\s+$/$1/s;
print "\n\n=", $string, "=";
такой:
Code (any language): скопировать код в буфер обмена
=some text

  =
т.е. вначале скрипт убирает и пробелы и переводы строк, а в конце нет
Back to top
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 129
   поощрить/наказать


PostPosted: Wed Dec 06, 2006 11:33 pm (спустя 52 минуты; написано за 2 минуты 35 секунд)
   Post subject:
Reply with quote

Павел Ш. wrote:
странно, а мне казалось \s в регулярных выражениях включает все пробельные символы, т.е. [ \r\t\n\f]
Оно-то включает. Только не там, где надо. Метасимвол "\s" изначально соответствует \n. Модификатор "s" включает соответствие "." переносу строки.

То есть вам надо просто убрать модификатор "s" в вашем примере. Но я бы написал так: s/\s*(.+)\s*/$1/.
Back to top
View user's profile Send private message Send e-mail
Павел Ш.
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Dec 07, 2006 2:27 am (спустя 2 часа 54 минуты; написано за 5 минут 59 секунд)
   Post subject:
Reply with quote

Верно. Но немного изменим задачу:
Code (any language): скопировать код в буфер обмена
#!/usr/bin/perl
$string = qq~

   some
   text

   ~;
$string =~ s/^\s+(.*)\s+$/$1/;
print "\n\n=", $string, "=";
и теперь это рег. выр. уже не работает.

проблема в том, что у меня в качестве $string - введенный пользователем текст до 1000 символов, где может быть сколько угодно пробелов и переносов строки.

просто хотелось бы знать в чем мое недопонимание рег. выр. s/^\s+(.*)\s+$/$1/s
вроде все делаю правильно.. любое к-во пробельных символов изначально: \s+, потом сохраняем весь текст: максимальный поиск (.*) c переносами строк (модификатор /s), потом любое к-во пробельных символов в конце: опять \s+

Так в чем загвоздка?

С Уважением Павел.
Back to top
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 129
   поощрить/наказать


PostPosted: Thu Dec 07, 2006 2:40 am (спустя 13 минут; написано за 3 минуты 56 секунд)
   Post subject:
Reply with quote

Павел Ш. wrote:
Так в чем загвоздка?
Э, дорогой мой, загвоздка в том, что надо уметь ставить задачу правильно. Я же не просто так просил её сформулировать в самом начале темы.

Тогда вам надо вот так делать: s/^\s*(.+?)\s*$/$1/s . Надо ж жадность-то убирать. (-:

Но вообще я бы это сделал двумя регами:
Code (perl): скопировать код в буфер обмена
/^\s*//
/\s*$//
Во-первых, перлу не надо будет смотреть все 1000 символов. Во-вторых, не будет создаваться переменная $1, которая также ест память.
Back to top
View user's profile Send private message Send e-mail
Павел Ш.
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Dec 07, 2006 2:45 am (спустя 4 минуты; написано за 2 минуты)
   Post subject:
Reply with quote

Я наверное понял, в чем проблема..
в этом рег. выр. есть три максимальных поиска: \s+ .* \s+
получается что максимализм действует не в том порядке, который мне нужен..

тогда как правильно построить регулярное выражение?
Back to top
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu Dec 07, 2006 2:48 am (спустя 3 минуты; написано за 14 секунд)
   Post subject:
Reply with quote

Ant

Все, понял.

Спасибо большое за помощь!
Back to top
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 129
   поощрить/наказать


PostPosted: Thu Dec 07, 2006 3:32 pm (спустя 12 часов 44 минуты)
   Post subject:
Reply with quote


М

Пожалуйста.

Тема закрыта.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   This topic is locked: you cannot edit posts or make replies. All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You cannot download files in this forum.
XML