使用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)";
是否可以设置正则表达式来替换外观而不是匹配?或者我在考虑这个错误?
答案 0 :(得分:7)
$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正则表达式概括了这个问题(稍微解释):
听起来很简单,但有时很容易丢失。
答案 2 :(得分:0)
有两个不同之处使得您不希望删除的括号是唯一的:
您的目标描述含糊不清,可能适用于以下任何一种区别:“以空格分隔的字符”
鉴于你已经选择了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;