Программирование > Perl

помогите придумать регулярное выражение

(1/4) > >>

w01k:
задача следующая: разделить разряды ЦЕЛОГО числа запятыми слева направо. всё должно быть оформлено в виде s/regexp/.../g. при этом числа могут быть разделены точками

у меня получается только так:
$src =~s/((?:\\D+\\.)|(?:\\s\\d*?))(\\d\\d\\d)(?=(\\d+\\.\\D+)|(\\d+\\s))/\\1\\2,/g;

при этом
исходная строка: ...15785456451  556 88 4   fghd454444    4210101.98752 7895.3545135 984785848 156518..4856..
результат: ...157,85456451  556 88 4   fghd454444    4210101.98752 7895.3545135 984,785848 156,518..485,6..

либо так:
$src =~s/(?
исходная строка: ...15785  556 88 4   fghd454444    4210101.98752 7895.3545135 984785848 156518..4856..
результат: ...157,85  556 88 4   fghd454,444    4210101.9875,2 7895.3545,135 984,785,848 156,518..485,6..

w01k:
строчка
$src =~s/(\\d\\d\\d)||(\\W\\d+\\.\\d+)||([A-Za-z]+\\d+\\W)/\\1/g;
выводит всё, кроме тех чисел и переменных, которые не нуждаются в разделении на разряды.
...15785  556 88 4   fghd454444 4578/456/5/46445:45454:5:45:564556   4210101.98752 7895.3545135 984785848 156518..4856..Testing... OK! It works

...15785  556 88 4   4578/456/5/46445:45454:5:45:564556   984785848 156518..4856..Testing... OK! It works
 как этим воспользоваться - не понимаю(((


можно ли каким-нибудь образом совместить эти строки в одну?
$src =~s/[A-Za-z]+\\d+//g;
$src =~s/\\d+\\.\\d+//g;
$src =~s/(\\d\\d\\d)(?=\\d)/\\1,/g;
они делают, что требуется, правда, удаляют всё, не подходящее под шаблон
исх. строка: ...15785  556 88 4   fghd454444 4578/456/5/46445:45454:5:45:564556   4210101.98752 7895.3545135 984785848 156518..4856..Testing... OK! It works
результат: ...157,85  556 88 4    457,8/456/5/464,45:454,54:5:45:564,556     984,785,848 156,518..485,6..Testing... OK! It works


ещё вопрос, можно писать так:
perl -pe -e \'s///\' -e \'s///\' filename

ravshaniy:

--- Цитировать ---w01k:
ещё вопрос, можно писать так:
perl -pe -e \'s///\' -e \'s///\' filename
--- Конец цитаты ---


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



--- Цитировать ---w01k:
можно ли каким-нибудь образом совместить эти строки в одну?
--- Конец цитаты ---

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

если как результат вашу задачу перефразировать.
то исходная строка - набор символов разделенных пробелом.
из этого набора символов нужно выбрать целые числа и провести над ними какуюто операцию с запятой, или просто сделать вывод всех целых чисел через запятую.
Если я прав в формулировании задачи. то самый простой ответ, на мой взягляд, будет таким :

--- Код: ---
my $str = \'15785 556 88 4 fghd454444 4578/456/5/46445:45454:5:45:564556 4210101.98752 7895.3545135 984785848 156518..4856..\';
$str.=\' \';
@str=$str=~m/(.*?)\\s/g;
@str=grep{/^(\\d+)$/} @str;
print $_,", " foreach(@str);

--- Конец кода ---

w01k:
в том то и дело, что задача состоит в том, чтобы решение представляло собой одну строчку. причём запускаемую через командную строку вида:
perl [-p -e -i] \'s/regexp/.../g\'
вот(((

w01k:
нужно не просто вывести все целые числа, разделяя их запятой, а модифицировать исходный текст файла/строки так, чтобы в целых числах разряды разделялись запятой. например:
454153 7842 45 456 7845.12 789,456:45:1234562 ах1000
454,153 784,2 45 456 7845.12 789,456:45:123,456,2 ах1000

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии