Нужно, если символ в строке повторяется более 3 раз подряд урезать до 3 символов, то есть:abc aaaaaaa bccccccccccd
должно стать
abc aaa bcccdЧто-то ни как не получается :(( Подскажите .....
s/(.)\1{2,}/\1\1\1/g
>s/(.)\1{2,}/\1\1\1/g
Спасибо, вечером дома попробую.
>Нужно, если символ в строке повторяется более 3 раз подряд урезать до
>3 символов, то есть:
>
>abc aaaaaaa bccccccccccd
>должно стать
>abc aaa bcccd
>
>Что-то ни как не получается :(( Подскажите .....
Пробел -- это символ? Если нет, тогда:
bash$ echo "abc aaaaaaa bccccccccccd" | sed -e 's/\([^ ]\)\1\{3,\}/\1\1\1/g'
Да пробел - это тоже символ...Попробовал вариант '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Как исправить ?
>Да пробел - это тоже символ...
>
>Попробовал вариант '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.
Супер, спасибо,
Теперь, если мне все это просто в перле использовать, то нужно просто экранироавние снять , так ?
>Супер, спасибо,
>Теперь, если мне все это просто в перле использовать, то нужно просто
>экранироавние снять , так ?
bash$ echo 'abc aaaaaaa bccccccccd aabbbcc' | \
perl -e '$_=<STDIN>; s/(.)\1{3,}/\1\1\1/g; print $_;'
>>Супер, спасибо,
>>Теперь, если мне все это просто в перле использовать, то нужно просто
>>экранироавние снять , так ?
>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 '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>Странно, везде все поразному работает :(
Утюг и сковородка тоже работают по-разному.
Огромное спасибо. Я удивляюсь Вашим знаниям нюансов регулярных выражений. У меня есть небольшой мануал, который я до запятой знаю, но работая с регулярными выраженими постоянно встречаешь что-то новое..> ereg_replace("((.)\\2{3,})", "\\2\\2\\2", $str);'
Почему, например, здесь Вы использовали \\2, а не \\1 ?? Читая мануал php по функции ereg_replace не скажешь, что так надо делать :(
>Я удивляюсь Вашим знаниям нюансов регулярных выражений.
...И опыт, сын ошибок трудных,...>У меня есть
>небольшой мануал, который я до запятой знаю, но работая с регулярными
>выраженими постоянно встречаешь что-то новое..
Вопрос "почему так происходит?" очень близок вопросу "что такое образование,
и зачем оно нужно?".>> ereg_replace("((.)\\2{3,})", "\\2\\2\\2", $str);'
>
>Почему, например, здесь Вы использовали \\2, а не \\1 ?? Читая мануал
>php по функции ereg_replace не скажешь, что так надо делать :(
Скажешь.
\2 обозначает последнее () выражение, здесь оно второе, потому что первое --
это весь искомый образец. В Perl формулировка та же -- \1 первое ()
выражение; только весь образец в скобки заключать не обязательно.
Спасибо, будем изучать далее:))