簡體   English   中英

從文本中刪除回車符和特殊字符

[英]Remove carriage return and special characters from text

我在用Java編寫的代碼中使用文本,然后刪除所有標點符號(空格-新行和數字)所有特殊字符,僅保留A到Z字母。 它可以正常工作,直到到達第一個回車並停止為止。 我嘗試了很多版本的replaceAll,但沒有用,請幫忙!

例如

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

PIMAATODMC DNL IITIAMRO CUNAIMYNAOINI。

然后我得到:

IHNEMATMGEECNIWEARSHIARESOEFESRLTCMEECOEAACIROHTLNHRPIRMOAECSHENEVCEDIAODEDULSNPHDTNEAEIIYTWYLEDTTHEENNTCIPROTOTUERYMTMORCIECL

 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}]","");

replaceAll返回帶有替換的String。 原始字符串保持不變。 現在的問題是,您有兩個來自相同原始String的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()掃描到下一個行分隔符。 您可能需要做的就是繼續閱讀台詞並將它們連接在一起。

一個永遠不要以大寫字母開頭變量名稱! 大寫字母用於類型(“ 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]+", "");

3我也同意J Earls的觀點,《掃描儀》的Jekin Kalriya是您問題的根源。 如果要讀取多行,則需要迭代掃描儀的行:

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

請注意您的情況:

  1. 這使您陷入無限循環,因為System.in永無止境! 您將檢查某個輸入是否想要停止迭代。
  2. 輸出到鍵入控制台的每一行之后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM