2013-07-02 90 views
0

我有一個字符串'Basingstoke & Deane',我想檢查'&'符號,並從該點(包括)切下字符串。如何截斷perl中特定字符的字符串?

所以我輸入的是:'Basingstoke & Deane'

和輸出是:'Basingstoke '

我可以搜索使用$string =~ /&/'&'優良,可替代/使用s/&//刪除它,但我有一個如何刪除&以及之後的所有字符。剩餘的空間並不重要。

這是很多字符串之一,因此一個通用的解決方案將是最好的。道歉,如果這之前已經問過,我已經看到了很多關於使用substr截斷字符串以及搜索特定字符串的問題等等的問題,但沒有什麼我正在尋找的東西。任何幫助讚賞。

+0

's /([^&] *)&/ $ 1 /' – user1937198

+0

或者更簡單的's /&.*//'或許? – duskwuff

+0

啊大好回答,歡呼! – dgBP

回答

4
$string =~ s/&.*//s; 

將刪除字符串的其餘部分,包括換行符。

+0

'/ s'做了什麼? – dgBP

+0

@bladepanthera,使''。匹配任何代碼點(而不是除了換行符之外的所有代碼點)。 – ikegami

+2

@bladepanthera http://perldoc.perl.org/perlre.html#Modifiers就像ikegami剛剛說的,它使通配符匹配任何字符。通常情況下,它不符合換行符。 – TLP

2

你也可以找到&的指標,並使用substr函數取字符串的一部分:

my $string = 'Basingstoke & Deane'; 
my $amp_index = index($string, '&'); 

print substr($string, 0, $amp_index); 
# Basingstoke 

禮貌@TLP的(substr當作左值):

substr($string, index($string, '&')) = "" 
+0

'substr($ string,index($ string,'&'))=「」;'也是一個巧妙的技巧。 – TLP

+0

@TLP是的,我忘了你可以用它作爲左值。我會在上面添加它。 –

+0

我認爲OP可以找出錯誤處理:) –

2
my ($prefix) = $string =~ /^([^&]*)/s; 

my ($prefix) = split /&/, $string;  # Slightly faster, IIRC 

就地:

$string =~ s/&.*//s; 
+0

在你的第一個例子中,脫字符號是無關緊要的。編輯:行錨的開始,即。 – TLP

+0

@TLP,沒錯,但這是一個很好的做法。它不僅告訴讀者你期望它在字符串的開頭匹配,它可以避免類似表達式中的大量回溯。 – ikegami

+0

它肯定不會傷害,如果確實要從一開始就匹配,如果是這樣,那麼最好將它包括進去,就像你說的那樣。 – TLP