2017-04-07 131 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/\(.*//; 
相關問題