我在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}]","");
答案 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);
}
请注意您的情景: