Помогите с регулярным выражением

Модератор: Модераторы разделов

Аватара пользователя
Devider
Сообщения: 476
ОС: GNU/Linux

Помогите с регулярным выражением

Сообщение Devider »

Есть строка типа #a1$bcd#ef5#gh, т.е. произвольные буквы-цифры и разделитель в виде # или $ . Каким выражением это разобрать, при условии что ПЕРВЫЙ разделитель не учитывается? Т.е нужно получить подстроки #a1 bcd ef5 gh , При этом первого # или $ может и не быть, т.е. может строка может быть вида a1$bcd#ef5# .
Спасибо сказали:
alfss
Сообщения: 262

Re: Помогите с регулярным выражением

Сообщение alfss »

perl

print join(':', split(/\$|#/, '#a1$bcd#ef5#gh'));
Спасибо сказали:
Аватара пользователя
Devider
Сообщения: 476
ОС: GNU/Linux

Re: Помогите с регулярным выражением

Сообщение Devider »

alfss писал(а):
19.08.2009 23:52
perl

print join(':', split(/\$|#/, '#a1$bcd#ef5#gh'));

Спасибо. А.. на чем-нибудь более java-подобном как это может выглядить?
Спасибо сказали:
alfss
Сообщения: 262

Re: Помогите с регулярным выражением

Сообщение alfss »

Спасибо сказали:
Аватара пользователя
Devider
Сообщения: 476
ОС: GNU/Linux

Re: Помогите с регулярным выражением

Сообщение Devider »

Сорри, я не это имел ввиду.
print join(':', split(/\$|#/, '#a1$bcd#ef5#gh'));

Слеши на концах это типа кавычки? ТОгда что остается? $ - конец строки | или # - разделитель... а \ что значит? Я просто смысла этого не понимаю.

В перле ни разу не силен, но получаю
$ perl -e 'print join(':', split(/\$|#/, '#a1$bcd#ef5#gh'));'
syntax error at -e line 1, near "join(:"
Execution of -e aborted due to compilation errors.
Спасибо сказали:
alfss
Сообщения: 262

Re: Помогите с регулярным выражением

Сообщение alfss »

split(/\$|#/, 'строка');
разделитель $ или #

\ - экранирование
Спасибо сказали:
Аватара пользователя
Devider
Сообщения: 476
ОС: GNU/Linux

Re: Помогите с регулярным выражением

Сообщение Devider »

Разобрался, спасибо. ПРишлось в файл запихнуть. Вот вывод.
perl sc.pl
:a1:bcd:ef5:gh

ПРоблема в том, что разделителями являются все # и $ кроме первого, т.е. вывод нужен такой:
#a1:bcd:ef5:gh
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Помогите с регулярным выражением

Сообщение sash-kan »

Код: Выделить всё

$ echo '#a1$bcd#ef5#gh' | sed 's/\(.\)[$#]/\1:/g'
#a1:bcd:ef5:gh

если встрачаются пустые поля (два идущих подряд разделителя), выражение, конечно, придётся усложнить.

upd. если можно несколько идущих подряд разделителей заменить на один символ «:», тогда так:

Код: Выделить всё

$ echo '#a1$bcd#$#ef5$#gh' | sed 's/\(.\)[$#]\+/\1:/g'
#a1:bcd:ef5:gh


upd2. если пустые поля надо учитывать, тогда вот эдак:

Код: Выделить всё

$ echo '#a1$bcd#$#ef5$#gh' | sed 's/\(\(^.\)\?[^$#]*\)[$#]/\1:/g'
#a1:bcd:::ef5::gh
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали: