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

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

<< < (3/4) > >>

ravshaniy:
И в нахождении регулярного выражения у нас возникает проблема с первым и последним набором символов/*словом*/ в строке /* в предложении*/. Исходное выражение приходится модернизировать чтобы правильно найти слова в предложении придется к исходному выражению прибавить по пробелу с начала и с конца.

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

s/[\\s|,|:]((\\d{3})(\\d+))[\\s|,|:]/\\2,\\3/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
--- Конец цитаты ---

строка - просто частность, пример различных комбинаций цифр.

--- Цитировать ---s/[\\s|,|:]((\\d{3})(\\d+))[\\s|,|:]/\\2,\\3/g
--- Конец цитаты ---

эт всё не то.   во-первых, результирующая строка будет "съедать" пробелы/какие-либо разделители. во-вторых, отделится только первый разряд
 123456789
 123,456789 (а надо 123,456,789)

я, вроде, придумал регулярное выражение (парился дня 3, при том, что это было задание на 40 минут...)

s/([^\\w\\.]|\\.\\.|\\G)(\\d{3})(?=(\\d+\\.\\D+)|(\\d+\\s))/\\1\\2,/g

ravshaniy:
отличное регулярное выражение. объясните только необходимость
(\\d+\\.\\D+)| - я думаю что
s/([^\\w\\.]|\\.\\.|\\G)(\\d{3})(?=(\\d+\\s))/\\1\\2,/g
вполне хватет

ravshaniy:
и все таки это регулярное выражение не справилось с таким выражением
789345345345345456:45:1234562

предлагаю все же - гну свою линию:
s/(\\s|,|:|\\G)(\\d{3})(?=\\d+(\\s|,|:|\\G))/$1$2,/g;

w01k:
спасибо за придуманный пример.

--- Цитировать ---объясните только необходимость
(\\d+\\.\\D+)|
--- Конец цитаты ---

это нужно для того, чтобы числа вида 1234.12323 не обрабатывались, т.к. они не целые.

--- Цитировать ---предлагаю все же - гну свою линию:
s/(\\s|,|:|\\G)(\\d{3})(?=\\d+(\\s|,|:|\\G))/$1$2,/g;
--- Конец цитаты ---

кроме \\s, , и : цифры могут быть разделены кучей других символов - придётся все перечислить. к тому же бессмыслено ставить знак конца предыдущего совпадения \'\\G\' до и после шаблона.
вот выражение, которое справилось со строкой

789345345345345456:45:1234562

s/([^\\w\\.]|\\.\\.|\\G)(\\d{3})(?=(\\d+\\.\\D+)|(\\d+[^\\w\\.])|(\\d+\\Z))/\\1\\2,/g

789,345,345,345,345,456:45:123,456,2

Навигация

[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 
Перейти к полной версии