Хорошо, я получил странный, что я создавал затор на некоторое время (ум дня пятницы не работает, я предполагаю).
Делает любой знает далеко анализировать строку и удалять весь текст внутри parens, не удаляя parens самостоятельно..., но с удалением parens найденный внутри.
т.е.
myString = "this is my string (though (I) need (help) fixing it)"
после прокручивания это, что я хочу это, было бы похоже:
myString = "this is my string ()"
очень важный для хранения тех двух parens там.
Если вы хотите использовать регулярные выражения без использования Regexp::Common. Посмотрите на функцию "Look Around". Она была введена в Perl 5. Вы можете прочитать больше о "Look Ahead" и "Look Behind" на regular-expressions.info. Также есть раздел "Look Around" в книге "Mastering Regular Expressions". Посмотрите на странице 59.
#!/usr/bin/env perl
use Modern::Perl;
my $string = 'this is my (string (that)) I (need help fixing)';
$string =~ s/(?<=\()[^)]+[^(]+(?=\))//g;
say $string;
Модуль Regexp :: Common имеет дело с более чем 1 верхним уровнем круглые скобки.
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;
Вывод:
111()55 a()g()() this is my string ()
Вам нужно снять скобки, чтобы они не начали группу захвата. Шаблон \(.+\)
соответствует самой длинной подстроке, которая начинается с (
и заканчивается )
. Это поглотит все до последнего )
, включая все промежуточные скобки. Наконец, мы заменяем эту строку строкой, содержащей только ()
:
#!/usr/bin/perl
use strict; use warnings;
my $s = "this is my string (though (I) need (help) fixing it)";
$s =~ s{\(.+\)}{()};
print "$s\n";