如何使用Perl删除括号内的文本?例如:
$ str =“这是一个(额外的东西)字符串。”
至
$ str =“这是一个字符串。”
我目前正在使用此功能,但它不起作用: $ str = ~s /(([^]] +))//;
谢谢!
答案 0 :(得分:7)
您需要转义括号,例如:
s/\([^)]*\)//g
更新:
要删除空格,您只需删除括号前的空格即可。这在大多数情况下都有效:
s/\s*\([^)]*\)//g
要处理嵌套的括号,您可以使用递归模式,如下所示:
s/\s*\((?:[^()]+|(?R))*\)//g
您可以在perlre中了解(?R)
等内容。
最后一个表达式适用于aaa (foo(b,a,2*(3+4)) b) (c (c) c) ddd (x).
之类的字符串,提供aaa ddd.
。
答案 1 :(得分:1)
(特别的,必须逃脱
s/\([^)]+\)//g
答案 2 :(得分:1)
到目前为止,没有一个解决方案是OP所要求的。
表达式$str =~ s/\([^)]*\)//g;
$str =~ s/[ ]?\(.*?\)[ ]?//g;
存在类似问题,为什么要使用这些方括号?如果没有不需要的东西,那么正则表达式是否足够毛茸茸?
我们需要更多毛茸茸的东西,所以我们可以吃多次嵌套的括号,并妥善处理需要的间距,但否则就丢弃它。这就是诀窍:
1 while $str =~ s/(\w?)(\s*)\([^()]*\)(\s*)(\w?)
/($1&&$4)?($1.($2?$2:$3).$4):($1?$1:$4)/ex;
修改强>
测试结果:
'This string is OK as is.' -> 'This string is OK as is.'
'This is a (extra stuff) string.' -> 'This is a string.'
'(Preliminary remark) string' -> 'string'
'String (with end remark)' -> 'String'
'A string (remark before punctuation)!' -> 'A string!'
'A (doubly (nested)) string' -> 'A string'
'A (doubly (no, (triply!) nested)) string' -> 'A string'
<强> EDIT2 强>
exg
限定导致错误处理“此(删除)(删除)是字符串”。所需要的只是ex
。
答案 3 :(得分:0)
这一行应该符合您的要求:
$str =~ s/[ ]?\(.*?\)[ ]?//g;
请注意,它不适用于嵌套括号(如(this)),因为正则表达式对于该类型的功能必须要复杂得多。
答案 4 :(得分:0)
我将特殊字符转换为十六进制,以便在我的正则表达式中使用
/\x28([^\x29]+)\x29/
答案 5 :(得分:0)
嗯我曾经期望应用“贪婪”的原则,即使在嵌套的时候一直吃到紧密的括号。也许使用索引和rindex函数的一点蛮力会更好。
但我仍然想知道,为什么不
$str =~ s/[ ]?\(.*?\)[ ]?//g;
一直啜饮到最后')'?
答案 6 :(得分:0)
拆分版。我有点喜欢分裂,因为它是非侵入性的,保留了原始格式,而且,正则表达式往往变得......复杂。当然,虽然你需要正则表达式来修剪它。
你仍然需要计算间距。预测额外空间是否会出现在前端或末尾并不是一件简单的事情,并且删除所有双倍空格将不会保留原始格式。这个解决方案消除了打开的parens前面的一个空间,没有别的。在大多数情况下都可以使用,假设输入开头有正确的标点符号。
use warnings;
use strict;
while (<DATA>) {
my @parts = split /\(/;
print de_paren(@parts);
}
sub de_paren {
my $return = shift;
my @parts = @_;
while (my $word = shift @parts) {
next unless $word =~ /\)/;
$word =~ s/^.*?\)// while ($word =~ /\)/);
$return =~ s/ $//;
$return .= $word;
}
return $return;
}
__DATA__
A (doubly (no, (triply!) nested)) string
This is a (extra stuff) string.
(Preliminary remark) string
String (with end remark) String (with end remark)
A string (remark before punctuation)!
A (doubly (nested)) string
输出是:
A string
This is a string.
string
String String
A string!
A string ->