perl正则表达式取出括在括号中的文本

时间:2011-07-03 16:03:32

标签: regex perl

如何使用Perl删除括号内的文本?例如: $ str =“这是一个(额外的东西)字符串。”
至 $ str =“这是一个字符串。”

我目前正在使用此功能,但它不起作用: $ str = ~s /(([^]] +))//;

谢谢!

7 个答案:

答案 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;

    • 将“这是一个(额外的东西)字符串”转换为“这是一个字符串”,在“a”和“string”之间留下两个空格。
    • 将“这是一个(双重(嵌套))字符串”转换为“这是一个字符串”。
    • 转换“这是一个(双重(不,(三重!)嵌套)表达式)字符串”to“这是一个嵌套的表达式)字符串”。
  • $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 ->