从文本中删除回车符和特殊字符

时间:2016-09-02 05:20:30

标签: java replace special-characters replaceall

我在java中编写一个代码,它接受文本,然后删除所有标点符号(,空格 - 新行和数字)所有特殊字符,只留下A到Z字母。它工作正常,直到第一次回车并停止。  我尝试了很多版本的replaceAll但它没有用,请帮助!

例如

  

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

     

PIMAATODMC DNL IITIAMRO CUNAIMYNAOINI。

然后我得到:

  

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);
    }
}

澄清我使用了以下内容,但没有一个起作用:

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

4 个答案:

答案 0 :(得分:1)

replaceAll返回带有替换项的String。原始字符串保持不变。现在,问题是你从同一个原始字符串中调用了两个replaceAll,第二个调用只是覆盖了第一个调用的变化:

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

你可能想要

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

或合并的正则表达式。

答案 1 :(得分:0)

问题可能是ScanText.nextLine()因为它将读取行直到检测到新行,所以在你的情况下它将停止在MORCCIECLL之后取字符串,我试图提供硬编码字符串并且其工作正常

答案 2 :(得分:0)

Scanner.nextLine()会扫描到下一行分隔符。您可能需要做的是继续阅读行并将它们连接在一起。

答案 3 :(得分:0)

一个永远不要用大写字母开始变量名!大写字母用于类型(" FooBar")和常量(" FOO_BAR"),变量应该被称为" fooBar":

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

两个我同意Artjom B. String是一个不可变的类。最初可能的每个方法都在改变原始字符串,实际上会返回一个包含已更改数据的新字符串。这样,您甚至可以使用流畅的符号轻松链接方法调用:

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

但是[^ a-zA-Z]也包含\ s,所以你的解决方案可以减少到一个班轮:

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

我也同意J Earls,Jekin Kalriya在扫描仪上是你问题的根源。如果要读取多行,则需要迭代Scanner的行:

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

请注意您的情景:

  1. 这让你进入无限循环,因为System.in永远不会结束!您可以检查某个输入,例如停止迭代。
  2. 在输入控制台的每一行之后输出。