从文本中删除回车 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);
}
请注意,在您的场景中:
- 这会让您陷入无限循环,因为 System.in 永远不会结束!您会检查某个输入以停止迭代。
- 在向控制台输入每一行后输出。
我正在 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);
}
请注意,在您的场景中:
- 这会让您陷入无限循环,因为 System.in 永远不会结束!您会检查某个输入以停止迭代。
- 在向控制台输入每一行后输出。