Удаление текста внутри паренов, но не паренов в Perl - PullRequest
6 голосов
/ 13 февраля 2010

Ладно, у меня есть странная штука, на которую я давил уже некоторое время (я думаю, пятидневный ум не работает).

Кто-нибудь знает о прочем, чтобы проанализировать строку и удалить весь текст внутри скобок, не удаляя сами скобки ... но удаляя найденные внутри скобки?

т.

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

после запуска через то, что я хочу, это будет выглядеть так:

myString = "this is my string ()"

очень важно держать там этих двоих.

Ответы [ 3 ]

10 голосов
/ 13 февраля 2010

Модуль 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 ()
6 голосов
/ 13 февраля 2010

Вам нужно убрать скобки, чтобы они не запустили группу захвата. Шаблон \(.+\) соответствует самой длинной подстроке, которая начинается с ( и заканчивается ). Это сожрет все до последнего ), включая любые промежуточные скобки. Наконец, мы заменим эту строку на строку, содержащую только ():

#!/usr/bin/perl

use strict; use warnings;

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

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

print "$s\n";
2 голосов
/ 13 февраля 2010

Если вы хотите использовать регулярные выражения без использования Regexp :: Common. Посмотрите на функцию «Осмотреться». Это было введено с Perl 5. Вы можете прочитать больше о «Look Ahead» и «Look Behind» на регулярных-экспрессионах. В книге «Освоение регулярных выражений» есть также раздел «Осмотреться». Смотрите на странице 59.

#!/usr/bin/env perl

use Modern::Perl;

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

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

say $string;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...