URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3744
[ Назад ]

Исходное сообщение
"Помогите с регулярными выражениями.."

Отправлено kD , 17-Дек-04 13:23 
Нужно, если символ в строке повторяется более 3 раз подряд урезать до 3 символов, то есть:

abc aaaaaaa bccccccccccd
должно стать
abc aaa bcccd

Что-то ни как не получается :(( Подскажите .....


Содержание

Сообщения в этом обсуждении
"Помогите с регулярными выражениями.."
Отправлено dev , 17-Дек-04 14:21 
s/(.)\1{2,}/\1\1\1/g

"Помогите с регулярными выражениями.."
Отправлено kD , 17-Дек-04 15:05 
>s/(.)\1{2,}/\1\1\1/g


Спасибо, вечером дома попробую.


"Помогите с регулярными выражениями.."
Отправлено SergeiZz , 17-Дек-04 15:13 
>Нужно, если символ в строке повторяется более 3 раз подряд урезать до
>3 символов, то есть:
>
>abc aaaaaaa bccccccccccd
>должно стать
>abc aaa bcccd
>
>Что-то ни как не получается :(( Подскажите .....
Пробел -- это символ? Если нет, тогда:
bash$ echo "abc aaaaaaa bccccccccccd" | sed -e 's/\([^ ]\)\1\{3,\}/\1\1\1/g'


"Помогите с регулярными выражениями.."
Отправлено kD , 17-Дек-04 18:59 
Да пробел - это тоже символ...

Попробовал вариант 's/(.)\1{2,}/\1\1\1/g':
echo "abc aaaaaaa bccccccccccd" | sed -e 's/(.)\1{2,}/\1\1\1/g'
sed: 1: "s/(.)\1{2,}/\1\1\1/g
": RE error: invalid backreference number

Второй вариант 's/\([^ ]\)\1\{3,\}/\1\1\1/g' был рабочим:
и вернул abc aaa bcccd
, но для пробелов не отработал :((

echo "abc aaaaaaa bccccc       cccccd" | sed -e 's/\([^ ]\)\1\{3,\}/\1\1\1/g'
abc aaa bccc       cccd

Как исправить ?


"Помогите с регулярными выражениями.."
Отправлено SergeiZz , 17-Дек-04 19:28 
>Да пробел - это тоже символ...
>
>Попробовал вариант 's/(.)\1{2,}/\1\1\1/g':
>echo "abc aaaaaaa bccccccccccd" | sed -e 's/(.)\1{2,}/\1\1\1/g'
>sed: 1: "s/(.)\1{2,}/\1\1\1/g
>": RE error: invalid backreference number
Это не для sed писано, ибо в sed () нужно экранировать: \(\)

>Второй вариант 's/\([^ ]\)\1\{3,\}/\1\1\1/g' был рабочим:
>и вернул abc aaa bcccd
>, но для пробелов не отработал :((
>
>echo "abc aaaaaaa bccccc       cccccd" |
>sed -e 's/\([^ ]\)\1\{3,\}/\1\1\1/g'
>abc aaa bccc       cccd
>
>Как исправить ?
Так:
bash$ echo 'abc aaaaaaa bccccccccd         aabbbcc' | \
        sed -e 's/\(.\)\1\{3,\}/\1\1\1/g'
Ещё, у меня \{3,\}, а не \{2,\} -- это тоже зависит от того, что именно
нам нужно, и как это делает sed.


"Помогите с регулярными выражениями.."
Отправлено kD , 17-Дек-04 19:49 
Супер, спасибо,
Теперь, если мне все это просто в перле использовать, то нужно просто экранироавние снять , так ?

"Помогите с регулярными выражениями.."
Отправлено SergeiZz , 20-Дек-04 13:58 
>Супер, спасибо,
>Теперь, если мне все это просто в перле использовать, то нужно просто
>экранироавние снять , так ?
bash$ echo 'abc aaaaaaa bccccccccd         aabbbcc' | \
        perl -e '$_=<STDIN>; s/(.)\1{3,}/\1\1\1/g; print $_;'


"Помогите с регулярными выражениями.."
Отправлено kD , 20-Дек-04 14:47 
>>Супер, спасибо,
>>Теперь, если мне все это просто в перле использовать, то нужно просто
>>экранироавние снять , так ?
>bash$ echo 'abc aaaaaaa bccccccccd        
> aabbbcc' | \
>        perl -e '$_=<STDIN>; s/(.)\1{3,}/\1\1\1/g; print $_;'

Однако в PHP не заработало:
$tmp = ereg_replace("(.)\1{3,}","\\1\\1\\1",$tmp);

Странно, везде все поразному работает :(


"Помогите с регулярными выражениями.."
Отправлено SergeiZz , 21-Дек-04 17:18 
>>bash$ echo 'abc aaaaaaa bccccccccd        
>> aabbbcc' | \
>>        perl -e '$_=<STDIN>; s/(.)\1{3,}/\1\1\1/g; print $_;'
>
>Однако в PHP не заработало:
>$tmp = ereg_replace("(.)\1{3,}","\\1\\1\\1",$tmp);
>
bash$ echo '<?php $str= "abc aaaaa          ddbbbbbbbbcc";' \
        '$nstr= preg_replace("/(.)\\1{3,}/", "\\1\\1\\1", $str);' \
        'print("$nstr\n"); ?>' | php
bash$ echo '<?php $str= "abc aaaaa          ddbbbbbbbbcc";' \
        '$nstr= ereg_replace("((.)\\2{3,})", "\\2\\2\\2", $str);' \
        'print("$nstr\n"); ?>' | php

>Странно, везде все поразному работает :(
Утюг и сковородка тоже работают по-разному.


"Помогите с регулярными выражениями.."
Отправлено kD , 21-Дек-04 18:40 
Огромное спасибо. Я удивляюсь Вашим знаниям нюансов регулярных выражений. У меня есть небольшой мануал, который я до запятой знаю, но работая с регулярными выраженими постоянно встречаешь что-то новое..

> ereg_replace("((.)\\2{3,})", "\\2\\2\\2", $str);'

Почему, например, здесь Вы использовали \\2, а не \\1 ?? Читая мануал php по функции ereg_replace не скажешь, что так надо делать :(


"Помогите с регулярными выражениями.."
Отправлено SergeiZz , 21-Дек-04 19:13 
>Я удивляюсь Вашим знаниям нюансов регулярных выражений.
...И опыт, сын ошибок трудных,...

>У меня есть
>небольшой мануал, который я до запятой знаю, но работая с регулярными
>выраженими постоянно встречаешь что-то новое..
Вопрос "почему так происходит?" очень близок вопросу "что такое образование,
и зачем оно нужно?".

>> ereg_replace("((.)\\2{3,})", "\\2\\2\\2", $str);'
>
>Почему, например, здесь Вы использовали \\2, а не \\1 ?? Читая мануал
>php по функции ereg_replace не скажешь, что так надо делать :(
Скажешь.
\2 обозначает последнее () выражение, здесь оно второе, потому что первое --
это весь искомый образец. В Perl формулировка та же -- \1 первое ()
выражение; только весь образец в скобки заключать не обязательно.


"Помогите с регулярными выражениями.."
Отправлено kD , 21-Дек-04 19:23 
Спасибо, будем изучать далее:))