2012-12-11 8 views
6

Chciałbym wiedzieć, jak usunąć pojedyncze cudzysłowy, ale nie apostrofów w perlu.Jak usunąć pojedyncze cudzysłowy, ale nie apostrofów w perl

Na przykład: '! Pada deszcz ponownie'

druku

Pada deszcz ponownie!

Dzięki tak dużo

+1

próbek wykorzystywać ten sam charakter zarówno dla pojedynczych cudzysłowów i apostrofów, postać zdefiniowanego przez Unicode jako 'U + 0027 APOSTROPHE'. Zakładam, że to był twój zamiar, ale są też wyraźne znaki z pojedynczym cudzysłowem w Unicode, 'U + 2018 LEWY POJEDYNCZY CYTATYCZNY MARK' i' U + 2019 PRAWY POJEDYNCZY ZNAK CYTATYCZNY '.Możesz zaktualizować swoje pytanie, aby było wyraźniej, że wszystkie postacie są znakami apostrofowymi (zakładając, że o to Ci chodziło). –

+1

Nie sądzę, że będziesz w stanie to zrobić bez przetwarzania w języku naturalnym. To skomplikowana sprawa: "To takie frustrujące" - powiedziała - "zabawki chłopców są wszędzie". –

Odpowiedz

4

Jeśli założymy, że apostrofu jest zawsze przed lub po spacji, następujące pary wyrażeń regularnych powinno działać:

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

trzeba także uwzględnić jeśli ciąg rozpoczyna się lub kończy pojedynczą kwotą:

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

+1, ale \ s jest znakami białej przestrzeni, nie tylko przestrzeni (która jest jeszcze lepsza), nadal masz problem z liczbą mnogą: zabawki dla chłopców. –

+0

dzięki za sugestie/zmiany. –

1

Trudny. Niektóre pojedyncze cytaty przychodzą po lub przed literami, ale chcesz usunąć tylko te między literami. Być może coś w tym rodzaju, za pomocą negatywnych lookarounds:

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

co usunie albo apostrofów bez liter i spacji przed lub po nim. Mnóstwo zapowiedzi, które można śledzić. Rozszerzona wersja:

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

ta pokryje słowa jak - jak Eli Algranti zauważył w komentarzu - boys' toys i that's, ale język jest zawsze trudne do przewidzenia. Na przykład, to będzie prawie niemożliwe, aby rozwiązać coś takiego:

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

oczywiście, jeśli można oczekiwać twoi pojedyncze cytaty pojawiać się tylko na końcu lub na początku łańcucha, nie trzeba się tym nadzwyczajnego, możesz po prostu usunąć ostatni i pierwszy znak, przy użyciu wszelkich niezbędnych środków. Takich jak, na przykład, jak sputnik po prostu zasugerował:

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

WYJŚCIE

It's raining again! 

WYJAŚNIENIA

  • tam bardziej jednym niż jeden sposób, aby to zrobić
  • (:?) zapobiec zakaz potrzebne uchwycone
Powiązane problemy