2012-12-11 10 views
6

Ich möchte wissen, wie Sie einfache Anführungszeichen, aber keine Apostrophe in Perl löschen.So löschen Sie einfache Anführungszeichen, aber keine Apostrophe in Perl

Zum Beispiel: '! Es ist wieder regnet'

Druck

es wieder regnet!

Vielen Dank

+1

Ihre Proben den gleichen Charakter für beide einfache Anführungszeichen und Apostrophe verwenden, das Zeichen definiert durch Unicode als 'U + 0027 APOSTROPHE'. Ich nehme an, dass dies Ihre Absicht war, aber es gibt auch eindeutige Anführungszeichen in Unicode, "U + 2018 LEFT SINGLE QUOTATION MARK" und "U + 2019 RIGHT SINGLE QUOTATION MARK".Möglicherweise möchten Sie Ihre Frage aktualisieren, um zu verdeutlichen, dass alle Zeichen das Apostroph-Zeichen sind (vorausgesetzt, Sie haben das so gemeint). –

+1

Ich glaube nicht, dass du das ohne eine natürliche Sprachverarbeitung machen kannst. Hier ist ein komplexer Fall: "Es ist so frustrierend", sagte sie, "die Spielsachen der Jungs sind überall." –

Antwort

4

Wenn Sie davon ausgehen, dass eine einzelne Anführungszeichen immer oder Leerzeichen gefolgt vorangestellt ist, sollte das folgende Paar von regulären Ausdrücken arbeiten:

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

Sie müssen auch berücksichtigen wenn die Zeichenfolge mit einem einfachen Angebot beginnt oder endet:

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

+1 aber \ s ist Leerzeichen nicht nur Platz (was noch besser ist), Sie haben immer noch ein Problem mit den Plural Possessives: die Jungen Spielzeug. –

+0

danke für die Vorschläge/Bearbeitungen. –

1

Tricky eins. Einige einfache Anführungszeichen kommen nach oder vor Buchstaben, aber Sie möchten nur diejenigen zwischen Buchstaben entfernen. Vielleicht so etwas wie dieses, mit negativen lookarounds:

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

Welche entweder Apostrophe ohne Buchstaben oder Leerzeichen vor oder nach ihm entfernen. Viele Negationen, um dort zu verfolgen. Die erweiterte Version:

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

Diese Worte wie abdecken wird - wie Eli Algranti wies in einem Kommentar aus - boys' toys und that's, aber die Sprache ist immer schwierig zu prognostizieren. Zum Beispiel wird es unmöglich sein, etwas zu lösen wie:

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

Natürlich, wenn Sie Ihre Apostrophe erwarten nur am Ende oder am Anfang der Zeichenfolge erscheinen, brauchen Sie nicht, diese Phantasie zu sein, Sie können nur das letzte und erste Zeichen mit allen notwendigen Mitteln entfernen. wie zum Beispiel als sputnik gerade vorgeschlagen:

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

OUTPUT

It's raining again! 

ERKLäRUNGEN

  • es mehr ein als nur ein Weg, es zu tun
  • (:?) verhindern nicht benötigt Capture
Verwandte Themen