2012-12-11 101 views
6

我想知道如何刪除單引號但不是perl中的撇號。如何刪除單引號但不是perl中的撇號

例如: '!又下雨了'

打印

又下雨了!

非常感謝

+1

你的樣品使用兩個單引號和撇號相同的字符,通過Unicode作爲'U + 0027 APOSTROPHE'定義的字符。我認爲這是您的意圖,但Unicode中也有不同的單引號字符,「U + 2018左單引號」和「U + 2019右單引號」。你可能想要更新你的問題,使其更清楚,所有的字符都是撇號字符(假設這就是你的意思)。 –

+1

如果沒有一些自然語言處理,我不認爲你能做到這一點,這是一個複雜的案例:「這太令人沮喪了,」她說'男孩們的玩具無處不在'。 –

回答

4

如果假設一個單引號總是之前或之後的空白,下面的一對正則表達式應該工作:

$line =~ s/\s'/ /g; #preceded by whitespace 
$line =~ s/'\s/ /g; #followed by whitespace 

你還需要考慮如果字符串以單引號開頭或結尾:

$str =~ s/^'//; #at the start of a string 
$str =~ s/'$//; #at the end of a string 
+1

+1但是\ s是空白字符不僅空間更大(這更好),你仍然有複數所有物的問題:男孩的玩具。 –

+0

感謝您的建議/編輯。 –

1

棘手的一個。一些單引號出現在字母之後或之前,但您只想刪除字母之間的那些引號。也許這樣的事情,使用負lookarounds:

s/(?<![\pL\s])'|'(?![\pL\s])//g; 

之後或之前這將刪除要麼單引號沒有字母或空格。很多的否定來追蹤那裏。擴展版本:

s/ 
    (?<![\pL\s])' # no letters or whitespace before single quote 
    |    # or 
    '(?![\pL\s]) # no letters or whitespace after single quote 
//gx; 

這將覆蓋類的字眼 - 爲禮Algranti在評論中指出 - boys' toysthat's,但語言始終是棘手的預測。例如,這將是幾乎不可能解決類似:

'She looked at him and said, 'That's impossible!'' 

當然,如果你希望你的單引號僅在年底或字符串的開頭出現,你並不需要成爲這個幻想,您可以使用任何必要的方法刪除最後一個字符和第一個字符。比如,例如,如人造衛星只是建議:

s/^'|'$//g; 
1
foreach (<DATA>) { 
    s/(:?(^\s*'|'$))//g; 
    print; 
} 
__DATA__ 
'It's raining again!' 

輸出

It's raining again! 

解釋

  • 有做多一個比一個方式
  • (:?)防止非所需捕獲