删除parens中的文本,但不删除Perl中的parens

时间:2010-02-12 22:57:03

标签: perl string

好的,我有一个奇怪的,我已经干了一段时间(我觉得下午头脑不起作用)。

有没有人知道要解析一个字符串并删除parens中的所有文本而不删除parens本身...但删除了内部的parens。

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

在运行它之后我会看起来像:

myString = "this is my string ()"
保持那两个parens非常重要。

3 个答案:

答案 0 :(得分:10)

模块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 ()

答案 1 :(得分:6)

您需要转义括号以防止它们启动捕获组。模式\(.+\)匹配以(开头并以)结尾的最长子字符串。这将吞噬到最后)的所有内容,包括任何中间括号。最后,我们将该字符串替换为仅包含()的字符串:

#!/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 :(得分:2)

如果要在不使用Regexp :: Common的情况下使用正则表达式。看看“环顾四周”功能。它是在Perl 5中引入的。 您可以在regular-expressions.info阅读更多关于“向前看”和“向后看”的内容。 在“掌握正则表达式”一书中还有一个关于“环顾四周”的部分。请参阅第59页。

#!/usr/bin/env perl

use Modern::Perl;

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

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

say $string;