Программирование > Perl
помогите придумать регулярное выражение
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
Навигация
Перейти к полной версии