2017-04-07 129 views
1
my $book = Spreadsheet::Read->new(); 
my $book = ReadData 
('D:\Profiles\jmahroof\Desktop\Scheduled_Build_Overview.xls'); 
my $cell = "CD7"; 
my $n = "1"; 
my $send = $book->[$n]{$cell}; 
$send =~ s/\(/ /g; 
$send =~ s/\)//g; 

我有上面的代码,从一个excel文件中获取数据,然后从指定的细胞挑选出的文字和从字符串中移除支架。我需要能够删除括号内括号内的所有内容,同时保留文本的其余部分。字符串的格式是完全一样的以下内容:text(text)如何在保留其他文本的同时删除字符串中括号内的文本?

回答

0
$send =~ s/\(.*?\)//; 

解释:

s/进行搜索 \逃脱那随之而来的是,如果没有逃过它会被看作是代码的一部分支架。 (.*?\)这里我们说什么,我们正在寻找一个我们使用非贪婪。*?以匹配最后一个支架上的任何东西,最后一个支架被转移\ /开始替换功能的搜索 /结束搜索和替换。

所以我们搜索(*),然后替换为无。

解释非贪婪vs贪婪。

。*是贪婪的匹配,直到最后)发现

因此,如果我们有string((substring)end)then s/(.*)//将从第一(上去最后)离开你string

非贪婪不会,它将与第一(到第一)开始离开你stringend)所以这将是懒惰和只匹配你问什么,这是从(到),其中贪婪匹配抢的一切,即使你有这个(string)(())((strings))()()strings)strings)

+0

请问为什么这个组? – sidyll

+1

固定。谢谢,打字太快了。 –

+0

谢谢,它的作品!但是,能否请你解释一下,或者指给我一些我可以学会理解的地方? –

0

如果你没有嵌套的括号,这单独置换可以做到这一点:

$send =~ s/\(.*?\)//; 

如果这些括号是总是文本的最后一个项目,它可以进一步简化为:

$send =~s/\(.*//; 
相关问题