2016-09-02 2 views
0

Ich schreibe einen Code in Java, der Text nimmt, dann entfernen Sie alle Interpunktionen (, Leerzeichen - neue Zeile und Ziffern) alle Sonderzeichen und lassen Sie einfach die A bis Z Buchstaben. es funktioniert gut bis zur ersten Wagenrückfahrt und gestoppt. Ich habe versucht, viele replaceAll-Version, aber es hat nicht funktioniert, bitte helfen!Carriage Return und Sonderzeichen aus dem Text entfernen

beispiels

IHN- EMATMG EECNIWEA RSHI A RESOEF ES RLTCMEE-COEAACIROH TLNHR PIRMOA ECSHENEV CEDIAODED ULS NPHD TN EAE REIIY-MO TWL-EDTHTTEEN NTCIPRO TO TUERYMT MORCCIECLL,

PIMAATODMC DNL IITIAMRO CUNAIMYNAOINI.

dann erhalte ich:

IHNEMATMGEECNIWEARSHIARESOEFESRLTCMEECOEAACIROHTLNHRPIRMOAECSHENEVCEDIAODEDULSNPHDTNEAEREIIYMOTWLEDTHTTEENNTCIPROTOTUERYMTMORCCIECLL

package Cipher1; 

import java.util.Scanner; 

public class StripCipher 
{ 
    public static void main(String[] args) 
    { 
     // Take the input of the encrypted text from the user. 
     System.out.println(" Enter the cipher text : "); 
     Scanner ScanText = new Scanner(System.in); 
     String OriginalCipherText = ScanText.nextLine(); 

     // Eliminate the wide space and special characters present in the input 
     // text. 
     String CipherText = OriginalCipherText.replaceAll("\\s+", ""); 
     CipherText = OriginalCipherText.replaceAll("[^a-zA-Z]+", ""); 
     System.out.println(" Striped Cipher text is : " + CipherText); 

     // Calculate the length of the text. 
     int CipherTextLength = CipherText.length(); 
     System.out.println(" Lenght of the cipher text is : " + CipherTextLength); 
    } 
} 

für Präzisierungen habe ich die folgenden, aber keiner von ihnen arbeiten:

replaceAll("[\n\r]", ""); 
replaceAll("\\r|\\n", "") 
replaceAll("[^\\w\\s]",""); 
replaceAll("[^\\p{L}\\p{Z}]",""); 

Antwort

1

replaceAll gibt einen String mit den Ersetzungen zurück. Die ursprüngliche Saite bleibt gleich. Nun ist das Problem, dass Sie mit zwei replaceAll Anrufe aus dem gleichen ursprünglichen String und der zweite überschreibt einfach die Änderungen von der ersten:

String CipherText = OriginalCipherText.replaceAll("\\s+", ""); 
CipherText = OriginalCipherText.replaceAll("[^a-zA-Z]+", ""); 

Sie wollen wahrscheinlich

String CipherText = OriginalCipherText.replaceAll("\\s+", ""); 
CipherText = CipherText.replaceAll("[^a-zA-Z]+", ""); 

oder ein kombiniertes Regulären Ausdruck.

0

Problem könnte sein, ScanText.nextLine(), wie es Zeile gelesen wird, bis neue Linie erkannt wird so in Ihrem Fall wird es Zeichenfolge nach MORCCIECLL Einnahme, ich habe versucht, hart codierte Zeichenfolge und seine Arbeit feine

0

zu liefern Scanner.nextLine() scannt bis zum nächsten Zeilentrenner. Was Sie wahrscheinlich tun müssen, ist weiterhin Linien zu lesen und sie zusammenzufügen.

+0

Wie würden Sie das beheben? –

0

ein Starten Sie niemals einen Variablennamen mit einem Großbuchstaben! Großbuchstaben sind für die Typen ("FooBar") und für Konstanten ("FOO_BAR"), eine Variable sollte wie "fooBar" genannt werden:

static final FooBar FOO_BAR = new FooBar(); 
FooBar fooBar = new FooBar(); 

zwei ich mit Artjom B. String einverstanden ist eine unveränderliche Klasse . Jede Methode, die zuerst möglicherweise so aussieht, als ob sie die ursprüngliche Zeichenkette ändert, gibt tatsächlich eine neue Zeichenkette zurück, die die geänderten Daten enthält.Auf diese Weise können Sie auch einfach die Methode Kette ruft mit fließend Notation:

String cipherText = originalCipherText.replaceAll("\\s+", "") 
             .replaceAll("[^a-zA-Z]+", ""); 

Aber dann [^ a-zA-Z] enthält auch \ s, so können Sie Ihre Lösung auf einen Einzeiler reduziert werden:

String cipherText = originalCipherText.replaceAll("[^a-zA-Z]+", ""); 

drei Ich stimme auch mit J Earls, Jekin Kalriya auf dem Scanner als die Wurzel Ihrer Probleme. Wenn Sie mehrere Zeilen lesen möchten, müssen Sie die Scanner-Linien iterieren:

while (true) { 
    final String cypherText = scanText.nextLine() 
            .replaceAll("[^a-zA-Z]", ""); 
    System.out.println(cypherText); 
} 

Kenntnis, dass sich in Ihrem Szenario:

  1. bekommen diese Sie in eine Endlosschleife ist, als die System.in endet nie! Sie würden nach einer bestimmten Eingabe suchen, um die Iteration zu stoppen.
  2. Die Ausgabe kommt nach jeder Zeile, die in die Konsole eingegeben wird.
+0

Danke Jungs für die Aufklärung, aber wenn ich den dreiteiligen versuchte. es liest jeden Absatz allein, es gibt eine Möglichkeit, den ganzen Text zu lesen. – Imaginary

+0

Da Sie von System.in gelesen haben - wie würden Sie * in * mehreren Absätzen gleichzeitig erhalten? –

Verwandte Themen