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

Remove carriage return and special characters from text

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

例如

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.

然后我得到:

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

为了澄清,我使用了以下内容,但其中 none 有效:

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

replaceAll returns 带有替换的字符串。原始字符串保持不变。现在,问题是你有两个来自同一个原始字符串的 replaceAll 调用,第二个只是覆盖了第一个的更改:

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

你可能想要

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

或组合正则表达式。

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

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

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

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

two 我同意 Artjom B。字符串是不可变的 class。起初 可能 看起来像是在更改原始字符串的每个方法实际上 returns 一个包含已更改数据的新字符串。这样您甚至可以使用流畅的符号轻松链接方法调用:

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

但是 [^a-zA-Z] 也包含 \s,因此您的解决方案可以简化为一行:

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

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

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

请注意,在您的场景中:

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