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
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
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, 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. –
dzięki za sugestie/zmiany. –
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;
foreach (<DATA>) {
s/(:?(^\s*'|'$))//g;
print;
}
__DATA__
'It's raining again!'
WYJŚCIE
It's raining again!
WYJAŚNIENIA
(:?)
zapobiec zakaz potrzebne uchwycone
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). –
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". –