2012-10-01 68 views
2

我有一個字符串數組,其中一些包含字符' - '。我希望能夠搜索它和包含它的字符串我希望刪除它右側的所有字符。Perl的正則表達式 - 我可以說'如果字符/字符串匹配,刪除它,所有的權利'?

因此,舉例來說,如果我有:

$string1 = 'home - London'; 
$string2 = 'office'; 
$string3 = 'friend-Manchester'; 

什麼的這樣,那麼受影響的字符串將成爲:

$string1 = 'home'; 
$string3 = 'friend'; 

我不知道之前的白色空間「 - '將被包含在字符串中(我不想要它,因爲稍後我會比較字符串,但如果它不影響字符串比較,則無關緊要)。

我知道我可以搜索並使用類似替代的特定字符串/字符:

$string1 =~ s/-// 
or 
$string1 =~ tr/-// 

,但我不是很熟悉Perl的正則表達式,所以我不知道這些100% 。我環顧四周,在正則表達式中看不到'to the right of'的任何內容。幫助讚賞!

回答

5

可以連字符-用這種替代後刪除任何東西:

s/-.*$//s 

不過,你會想先刪除空格的連字符,因此做

s/\s* - .* $//xs 

$ anchores的字符串末尾的正則表達式和/s標誌允許點也匹配換行符。雖然$是多餘的,但它可能會增加清晰度。

您的替換隻會刪除第一個-,而您的音譯會從字符串中刪除所有連字符。

+0

兩個答案好了〜這其中有更多的有點,但+1每個:) – dgBP

3

你的正則表達式只是搜索破折號,所以這就是他們所取代的。你想搜索破折號和其後的任何東西。

$string =~ s/-.*//; 

。表示任何字符,*表示搜索該字符0次或更多次,並且儘可能匹配(即如果可能,則匹配字符串的末尾)

您還可以在它之前搜索可選空間。

$string =~ s/\s?-.*//; 

(\ S是指定一個空格字符更明確的方式)

+2

爲了讓您的空間可選,附加一個'?'它。 – amon

+0

Doh,當然。今天早上不能打字。編輯。 –

0

其他的答案是好的。但是,你所說的光:

...如果它不影響字符串比較那麼也不要緊

你並不需要爲這個單獨的步驟都。假設您想將$string與另一個變量$search_string進行比較。下面的表達式將檢查精確匹配,不同之處在於它忽略任何一個破折號後$string有:

if ($string =~ /^$search_string(\s*-|$)/) { print "Strings matched"; } 
+1

由於OP似乎表明,這將是一個字符串,字符串比較後'$ search_string'需要被引用,以確保它不被視爲一個正則表達式:'/^\ Q $ SEARCH_STRING \ E(\ S * - | $)/' –

3

使用普通substr()index()是可能的。

my @strings = ("we are - so cool", 
       "lonely", 
       "friend-Manchester", 
       "home - london", 
       "home-new york", 
       "home with-childeren-first episode"); 
local $/ = " "; 
foreach (@strings) { 
    $_ = substr($_,0,index($_,'-')) if (index($_,'-') != -1); 
    chomp; 
} 
+0

究竟是什麼讓這種超前?難道你沒有'$ string =〜'舞臺? – dgBP

+0

實際上,我決定將它更改爲substr()和index(),因爲這還沒有顯示出來...... [ - : – snoofkin

0

#Using Regex:

my @strings = 
("we are - so cool", 
"lonely", 
"friend - Manchester", 
"home - london", 
"home - new york", 
"home with-childeren-first episode" 
); 

foreach (@strings) { 
$_ =~ s/-\s*[a-zA-Z ]+\s*//g; 
print "NEW: ".$_."\n"; 
} 
+0

]通常最好解釋一個答案,而不僅僅是郵政編碼。 –

相關問題