2010-02-12 9 views
6

OK, mam dziwne, że zagłuszałem na chwilę (popołudniowy umysł nie działa, jak sądzę).Usuwanie tekstu wewnątrz parens, ale nie parens w Perl

Czy ktoś wie o wyjeździe, aby przetworzyć ciąg i usunąć cały tekst wewnątrz parens bez usuwania samych parens ... ale z usunięciem parens znaleźć wewnątrz.

tj.

myString = "this is my string (though (I) need (help) fixing it)" 

po uruchomieniu go przez to, co chcę, to będzie wyglądać:

myString = "this is my string()" 

bardzo ważne, aby utrzymać tam te dwa parens.

Odpowiedz

2

Jeśli chcesz użyć wyrażeń regularnych bez użycia REGEXP :: Common. Spójrz na funkcję "Rozejrzyj się". Został on wprowadzony w Perlu 5. Możesz przeczytać więcej o "Look Ahead" i "Look Behind" pod numerem regular-expressions.info. W dziale "Mastering Regular Expressions" znajduje się również sekcja "Rozejrzyj się". Spójrz na stronę 59.

#!/usr/bin/env perl 

use Modern::Perl; 

my $string = 'this is my (string (that)) I (need help fixing)'; 

$string =~ s/(?<=\()[^)]+[^(]+(?=\))//g; 

say $string; 
6

Musisz uciec z nawiasów, aby uniemożliwić im rozpoczęcie przechwytywania grupy. Wzorzec \(.+\) pasuje do najdłuższego podciągu zaczynającego się od ( i kończy się na ). To wszystko pożre wszystko do ostatniego ), włączając w to wszystkie nawiasy. Wreszcie możemy zastąpić ten ciąg z których jedna zawiera tylko ():

#!/usr/bin/perl 

use strict; use warnings; 

my $s = "this is my string (though (I) need (help) fixing it)"; 

$s =~ s{\(.+\)}{()}; 

print "$s\n"; 
+0

Działa tak długo, jak istnieje tylko jeden zestaw nawiasów najwyższego poziomu. W przeciwnym razie ciąg taki jak "this is my (string (that)) I (need help fixing)" stanie się "this is my()" zamiast "this is my() I()" – bobDevil

10

modułu Regexp::Common zajmuje się więcej niż 1 najwyższym poziomie nawiasach.

use strict; 
use warnings; 
use Regexp::Common qw/balanced/; 

my @strings = (
    '111(22(33)44)55', 
    'a(b(c(d)(e))f)g(h)((i)j)', 
    'this is my string (though (I) need (help) fixing it)', 
); 

s/$RE{balanced}{-parens=>'()'}/()/g for @strings; 

print "$_\n" for @strings; 

wyjściowa:

111()55 
a()g()() 
this is my string()
+1

Woah, Cool! Regexp :: Często zaskakuje mnie regularnie pełnym zbiorem wyrażeń regularnych ... –

+0

Sinan, dzięki za wyjaśnienia w kodzie. –

+0

Nie dziwię się, że można to zrobić w jednym wierszu Perla, ale jestem zaskoczony, że jest on czytelny! – dreamlax

Powiązane problemy