LINUX.ORG.RU

регулярное выражение


0

0

Есть строка типа "aaabbb"

Подскажите плиз как с помощью регулярного выражения вырезать внутрннюю пару ab (но не всю строку) ??? Замучился уже читать на нему квалификаторов жадности и тд...

anonymous

Какие нафик квалификаторы жадности. s/ab// или s/aaabbb/aabb/ в зависимости от того, что ты хочешь конкретно. Хотя возможно я твоё желание не угадал, объяснил ты не чётко.

Teak ★★★★★
()

а если вырезать строку как она есть в виде AAABBB, а потом взять подстроку начиная со 2го элемента ?

Reset ★★★★★
()

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

Если так, то регексп может быть таким: "(.)\1*\1(.)\2*", а строка замены "\1\2". При этом предполагается, что первая последовательность должна иметь не менее 2-х символов.

uj2 ★★★
()

можно разбить строку на 3 части (2 по краям которые нужны, 1в центре нет)

$str = "aaabbb";

if($str =~ /(aa)(\S+)(bb)/) {
print "$1$3\n";
} else {
print "Not found\n";
}

x97Rang ★★★
()

Сорри забыл сказать - между любым из указанных выше символом может быть любое количество других(не 'a' и 'b') символов

anonymous
()
Ответ на: комментарий от anonymous

Типа "a*a*a*b*b*b" где * - любое количество любых (но не 'a' и не 'b') символов нужно вырезать именно центральный кусок a*b

anonymous
()
Ответ на: комментарий от anonymous

из "a*a*a*b*b*b" получается вырезать либо все (если жадность у регекспа включить) либо "a*a*a*b" если жадность выключить, а нужно "a*b"...

второй день бъюсь, ничерта не вы ходит, помогите плиз !

anonymous
()
Ответ на: комментарий от anonymous

echo adfadgadgha123bdgbsgbsdfgbzxcv|sed -e "s/.*\(a[^b]*b\).*/\1/"

?

AS ★★★★★
()
Ответ на: комментарий от anonymous

> Типа "a*a*a*b*b*b" где * - любое количество любых (но не 'a' и не 'b') символов нужно вырезать именно центральный кусок a*b

s/(a[^ab]*a[^ab]*)(a[^ab]*b)([^ab]*b[^ab]*b[^ab]*)/$1$3/

Хотя опять не гарантирую, что правильно нателепатил твои потребности. В частности, если под "любым количеством" понимается всё же ненулевое количество символов, отличных от a и b, то * везде заменить на +.

Teak ★★★★★
()

s/(.*)a.*?b(.*)/$1$2/;

anonymous
()
Ответ на: комментарий от anonymous

> на поставленный вопрос существует единственный ответ: /.*(ab).*/

Ну-ну. Проверил бы хоть:

$ echo adfadgadgha123bdgbsgbsdfgbzxcv|sed -e "s/.*\(ab\).*/\1/"
adfadgadgha123bdgbsgbsdfgbzxcv

двоечник. :-) у тебя не хватает [^b]* между a и b. Я же уже написал ответ: sed -e "s/.*\(a[^b]*b\).*/\1/" и привёл пример, как проверить:

$ echo adfadgadgha123bdgbsgbsdfgbzxcv|sed -e "s/.*\(a[^b]*b\).*/\1/"
a123b

AS ★★★★★
()
Ответ на: комментарий от AS

але, чемодан с гвоздями, был задан вопрос:

> Есть строка типа "aaabbb"

На эту подстроку существует однозначный ответ.

vilfred ☆☆
()
Ответ на: комментарий от vilfred

еслиб ему хотелось увековечить строки aaaab#$%aaBaabAAAAqwweaba тогда был бы другой разговор, но ведь аффтар нам сообщил о строке "ааааbbbb", ну и досвидания...

vilfred ☆☆
()
Ответ на: комментарий от vilfred

Лучше, сначала, дочитать до конца. Цитата:

**
*Типа "a*a*a*b*b*b" где * - любое количество любых (но не 'a' и не 'b') *символов нужно вырезать именно центральный кусок a*b
*
*anonymous (*) (28.01.2007 21:56:17)
**

В общем, было уточнение. :-)

AS ★★★★★
()
Ответ на: комментарий от josephson

> %cat test0.sh
> #!/bin/sh
> echo 'acdanmaaaefbklbbbpqb'|sed -e "s/.*(a[^b]*b).*/$1/"

> Ы?..

Ы-гы. $1 - это у тебя первый параметр для test0.sh (хотя sh не пользуюсь, точно не скажу). У sed результат от () не $n, а \n, это раз.
А два - перед "(" и ")" поставь \. Я же написал:

s/.*\(a[^b]*b\).*/\1/

$ cat qqwwee
#!/bin/sh
echo 'acdanmaaaefbklbbbpqb'|sed -e "s/.*\(a[^b]*b\).*/\1/"
$ ./qqwwee
aefb

Хотя, может, это FreeBSD такая странная ? ;-) Впрочем, сомневаюсь, что в ней дело.

AS ★★★★★
()

а если слегка изменить условия задачи ? пусть 'b' это не один символ а последовательность скажем 'bzx' ? ведь [^b] в этом случае работать не будет...

anonymous
()
Ответ на: комментарий от anonymous

Выражение [^b]* по логике означает, что между пограничными 'a' и 'b' может находиться неопределённое количество символов, исключая 'b', и на последовательность, 'b' или 'bzx' будет далее в скобках, не повлияет.

josephson ★★
()
Ответ на: комментарий от josephson

%cat test.pl
#!/usr/bin/perl
$Line='acdanmaaaefbzxklbbbpqb';
$Line=~s/.*(a.[^b]*bzx).*/\1/;
print "$Line\n";

%./test.pl
aefbzx

josephson ★★
()
Ответ на: комментарий от josephson

> Выражение [^b]* по логике означает, что между пограничными 'a' и 'b' может находиться
> неопределённое количество символов, исключая 'b'

Именно так. А "a" исключатся за счёт .*a, то есть, их тоже не будет.

> и на последовательность, 'b' или 'bzx' будет далее в скобках, не повлияет.

ТАк по условию "между последней a и первой b". А если ограничителем хочется сделать bzx, но включить b, то надо zx просто за скобку вынести:


s/.*(a.[^b]*b)zx.*/\1/



AS ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.