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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Умная регулярка 
:(
    Опции темы
rcdimon
Дата 20.6.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне нужно сделать что бы программа вырезала из строки пробелы. Но только если они не между кавычками.

до:      1 2 345
после: 12345

до:        1 2 345 "6 7" '8 9'
после:   12345"6 7"'8 9'

кавычки могут быть двух типов ' и " 
PM MAIL ICQ   Вверх
nitr
Дата 20.6.2006, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Привет!
Держи
Код
#!perl
my $str = q|123'  456 ' 123 12 1234 " 567 " 890|;
$str =~ s{(['"].+?["'])|\s}{$1}g;
print $str;


работает для пар ковычек т.е. ' ' или " " 


--------------------
PM   Вверх
rcdimon
Дата 21.6.2006, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Прикольно. Спасибо!  smile  
PM MAIL ICQ   Вверх
rcdimon
Дата 21.6.2006, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



кстати она у тебя срабатывает на

'weruiy"

А кавычки то разные smile Надо сделать что бы обязательно кавычки были одинаковые. Вот


И вот еще на умную регулярку. smile

Надо сделать split

my @mass = split(//, $str);

Надо что бы эта штука разрезала строки по символам - или +. Причем эти символы НЕ ДОЛЖНЫ быть в скобках


Выражение: 123+3789-378
Результат- массив:
123
+
3789
-
378

Выражение: 1+(2+3)
результат-массив:
1
+
(2+3)

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


Эксперт
****


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

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



Цитата
кстати она у тебя срабатывает на

'weruiy"


Цитата
работает для пар ковычек т.е. ' ' или " " 
 


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


Опытный
**


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

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



немного изменил твое выражение. Теперь она находит то что между кавычками только в том случае если открываюая кавычка такая же как закрывающая

Найдет 'shdjk', найдет "оавлд"
Не найдет 'dfjkl" или "dfj'

$str =~ s{((['"]).+?\2)|\s}{$1}g;

просто добавил ссылку назад.

А кто мне поможет со split?  smile 
 
PM MAIL ICQ   Вверх
sharq
Дата 21.6.2006, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



rcdimon, 
Цитата(rcdimon @  21.6.2006,  14:33 Найти цитируемый пост)
А кто мне поможет со split?  smile 

если тебе нужно работать с математическими формулами, то советую воспользоваться алгоритмом раскрытия скобок или определения выражения.

Вот пример, который позволяет распарсить выражение так, как тебе надо, только если скобок внутри скобок нет.
Код

use strict;

my $str = '1+(2+3)';

my $i;
my @temp;
$str =~ s{( \( (?: [^)]* ) \) )}{push @temp, $1; '$'.$i++}gex; # сначала выбрасываем из строки скобочные выражения
my @mass = grep {s/^\$(\d)+$/$temp[$1]/e;1} split /\+|-/, $str; # затем составляем массив

print join "\n", @mass;


Можно сразу сделать так, если тебе не важен порядок следования:
Код

my @mass;
$str =~ s{( \( (?: [^)]* ) \) )}{push @mass, $1; ""}gex;
push @mass, split /\+/, $str;


 smile   

Это сообщение отредактировал(а) sharq - 21.6.2006, 23:27


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
rcdimon
Дата 21.6.2006, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вообще-то мне просто надо разрезать по -|+ только не в скобках smile 
PM MAIL ICQ   Вверх
sharq
Дата 22.6.2006, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



rcdimon, вообще-то запусти первый вариант  smile  


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
rcdimon
Дата 22.6.2006, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не... скобки могут быть вложенные...

Вот самое умное что мне удалось сделать 

(?<!\()([\-|\+])(?!\))

 1 + 2 - 333 - (-)
Порежет на

1
+
2
-
333
-
(-)

прямо как надо
но если будет не (-)  а например (     -     )  Но все... ничего хорошнго
тут получается что если скобка не вплотную к знаку то она уже ее не видит. Не увидит и (1 + 33)
 smile  
PM MAIL ICQ   Вверх
sharq
Дата 22.6.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



rcdimon, в чем проблема тогда, поставь \s* 


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
rcdimon
Дата 22.6.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мне не надо \s

Там могут быть любые символы ( 2 + 34 ) например

Могут быть и буквы и символы типа $@% и т.д.

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


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

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


 




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


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

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