好的,我有一个奇怪的,我已经干了一段时间(我觉得下午头脑不起作用)。
有没有人知道要解析一个字符串并删除parens中的所有文本而不删除parens本身...但删除了内部的parens。
即
myString = "this is my string (though (I) need (help) fixing it)"
在运行它之后我会看起来像:
myString = "this is my string ()"
保持那两个parens非常重要。
答案 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;