正则表达式删除由空格分隔的字符周围的括号

时间:2014-07-01 12:20:51

标签: regex perl

使用Perl,我试图替换围绕由空格分隔的整个单词的所有括号。例如,字符串:

$string = "A string (with words) is always easy to understand Ref: A(1,2)";

应该成为

$string = "A string with words is always easy to understand Ref: A(1,2)";

我可以使用lookarounds来获取匹配,但不确定如何替换括号而不是单词,即

$string =~ s/(?<=\s\()\w*(?=\)\s)//g;

会给出

$string = "A string () is always easy to understand Ref: A(1,2)";

是否可以设置正则表达式来替换外观而不是匹配?或者我在考虑这个错误?

3 个答案:

答案 0 :(得分:7)

使用capturing groups

$string =~ s/(\s)\(([^)]*)\)(\s)/$1$2$3/g;

或者如果您愿意:

$string =~ s/\s\K\(([^)]*)\)(?=\s)/$1/g;

(如果要删除括号,则括号必须包含在整个匹配结果中。)

答案 1 :(得分:1)

上述答案略有不同:

s/\s+\(([^)]*)\)\s+/ $1 /;

注意\ s上的“+号”。它允许括号周围有一个或多个空格。另请注意,$ 1的任一侧都有一个空格。

Notepad ++在这些情况下非常有用。它使用与Perl相同的$ 1语法。

J Friedl in Master正则表达式概括了这个问题(稍微解释):

  1. 匹配开场分隔符
  2. 匹配主要文本(任何内容 不是结束分隔符)
  3. 匹配结束分隔符
  4. 听起来很简单,但有时很容易丢失。

答案 2 :(得分:0)

有两个不同之处使得您不希望删除的括号是唯一的:

  1. 它被字母
  2. 包围
  3. 它只包含数字和标点符号(并且没有空格)
  4. 您的目标描述含糊不清,可能适用于以下任何一种区别:“以空格分隔的字符

    鉴于你已经选择了Casimir的答案,我将假设你的意思是#1。但是,为了允许在字符串的开头或结尾处使用括号,您应该使用负前瞻和后视来表示边界条件而不是空格字符类:

    my $string = "A string (with words) is always easy to understand Ref: A(1,2)";
    
    $string =~ s/(?<!\S)\(([^)]*)\)(?!\S)/$1/g;
    
    print $string;
    

    输出:

    A string with words is always easy to understand Ref: A(1,2)
    

    为了更加宽容,也许您只想排除在单词字符旁边拥抱的括号,但仍然会删除标点符号旁边的括号。如果是这种情况,那么您只需要将正则表达式调整为:

    $string =~ s/(?<!\w)\(([^)]*)\)(?!\w)/$1/g;