Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Умная регулярка


Автор: rcdimon 20.6.2006, 14:40
Мне нужно сделать что бы программа вырезала из строки пробелы. Но только если они не между кавычками.

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

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

кавычки могут быть двух типов ' и " 

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


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

Автор: rcdimon 21.6.2006, 06:35
Прикольно. Спасибо!  smile  

Автор: rcdimon 21.6.2006, 09:52
кстати она у тебя срабатывает на

'weruiy"

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


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

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

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

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


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

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

 

Автор: nitr 21.6.2006, 11:00
Цитата
кстати она у тебя срабатывает на

'weruiy"


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

Автор: rcdimon 21.6.2006, 13:33
немного изменил твое выражение. Теперь она находит то что между кавычками только в том случае если открываюая кавычка такая же как закрывающая

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

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

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

А кто мне поможет со split?  smile 
 

Автор: sharq 21.6.2006, 23:26
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   

Автор: rcdimon 21.6.2006, 23:42
Вообще-то мне просто надо разрезать по -|+ только не в скобках smile 

Автор: sharq 22.6.2006, 00:54
rcdimon, вообще-то запусти первый вариант  smile  

Автор: rcdimon 22.6.2006, 05:55
не... скобки могут быть вложенные...

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

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

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

1
+
2
-
333
-
(-)

прямо как надо
но если будет не (-)  а например (     -     )  Но все... ничего хорошнго
тут получается что если скобка не вплотную к знаку то она уже ее не видит. Не увидит и (1 + 33)
 smile  

Автор: sharq 22.6.2006, 10:47
rcdimon, в чем проблема тогда, поставь \s* 

Автор: rcdimon 22.6.2006, 12:33
мне не надо \s

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

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

Вот... а ставить типа .+ Я пытался... нифига
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)