Java 中正则表达式的奇怪行为
Strange behavior with Regex in Java
我想过滤一段文字,只留下字母(a-z 和 A-Z)。这似乎很容易,遵循这样的事情
String cleanedText = text.toString().toLowerCase().replaceAll("[^a-zA-Z]", "");
System.out.println(cleanedText);
这个输出为空的问题,除非我改变正则表达式,添加另一个字符,例如:
--> [^:a-zA-Z]
我已经尝试检查它是否适用于普通正则表达式(不使用 Java 中 String 对象提供的 ReplaceAll 方法),但我遇到了完全相同的问题。
知道这种奇怪行为的根源是什么吗?
我有一个使用 BufferedReader 读取的 txt 文件。我将每一行添加到一个长字符串中,并将我之前发布的代码应用于此。整个代码如下:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.StringBuffer;
import java.util.regex.*;
public class Loader {
public static void main(String[] args) {
BufferedReader file = null;
StringBuffer text = new StringBuffer();
String str;
try {
file = new BufferedReader(new FileReader("text.txt"));
} catch (FileNotFoundException ex) {
}
try
{
while ((str = file.readLine()) != null) {
text.append(str);
}
String cleanedText = text.toString().toLowerCase().replaceAll("[^:a-z]", "");
System.out.println(cleanedText);
} catch (IOException ex) {
}
}
}
文本文件是一篇普通文章,我想删除所有不是字母的内容(包括空格)。摘录如下“[16]自由软件基金会 (FSF),成立于 1985 年,旨在 "free" 这个词表示自由分发”
正如我在评论中所写,请更准确地说明问题所在...
我试过的
public class Regexp45348303 {
public static void main(String[] args) {
String[] tests = { "abc01", "01DEF34", "abc 01 def.", "a0101\n0202\n0303x" };
for (String text : tests) {
String cleanedText = text.toLowerCase().replaceAll("[^a-z]", ""); // A-Z removed too
System.out.println(text + " -> " + cleanedText);
}
}
}
输出为:
abc01 -> abc
01DEF34 -> def
abc 01 def. -> abcdef
a0101
0202
0303x -> ax
根据我的理解,这是正确的...
最终问题不在于正则表达式,也不在于程序本身。只是如果超过一定长度,eclipse 不会在控制台中显示输出(但您仍然可以处理它)。要解决这个问题,只需在 Window -> Preferences -> Run/Debug -> Console 中检查 fixed width console
如 http://code2care.org/2015/how-to-word-wrap-eclipse-console-logs-width/
中所述
Image of where to check fixed width console checkbox
我想过滤一段文字,只留下字母(a-z 和 A-Z)。这似乎很容易,遵循这样的事情
String cleanedText = text.toString().toLowerCase().replaceAll("[^a-zA-Z]", "");
System.out.println(cleanedText);
这个输出为空的问题,除非我改变正则表达式,添加另一个字符,例如:
--> [^:a-zA-Z]
我已经尝试检查它是否适用于普通正则表达式(不使用 Java 中 String 对象提供的 ReplaceAll 方法),但我遇到了完全相同的问题。
知道这种奇怪行为的根源是什么吗?
我有一个使用 BufferedReader 读取的 txt 文件。我将每一行添加到一个长字符串中,并将我之前发布的代码应用于此。整个代码如下:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.StringBuffer;
import java.util.regex.*;
public class Loader {
public static void main(String[] args) {
BufferedReader file = null;
StringBuffer text = new StringBuffer();
String str;
try {
file = new BufferedReader(new FileReader("text.txt"));
} catch (FileNotFoundException ex) {
}
try
{
while ((str = file.readLine()) != null) {
text.append(str);
}
String cleanedText = text.toString().toLowerCase().replaceAll("[^:a-z]", "");
System.out.println(cleanedText);
} catch (IOException ex) {
}
}
}
文本文件是一篇普通文章,我想删除所有不是字母的内容(包括空格)。摘录如下“[16]自由软件基金会 (FSF),成立于 1985 年,旨在 "free" 这个词表示自由分发”
正如我在评论中所写,请更准确地说明问题所在...
我试过的
public class Regexp45348303 {
public static void main(String[] args) {
String[] tests = { "abc01", "01DEF34", "abc 01 def.", "a0101\n0202\n0303x" };
for (String text : tests) {
String cleanedText = text.toLowerCase().replaceAll("[^a-z]", ""); // A-Z removed too
System.out.println(text + " -> " + cleanedText);
}
}
}
输出为:
abc01 -> abc
01DEF34 -> def
abc 01 def. -> abcdef
a0101
0202
0303x -> ax
根据我的理解,这是正确的...
最终问题不在于正则表达式,也不在于程序本身。只是如果超过一定长度,eclipse 不会在控制台中显示输出(但您仍然可以处理它)。要解决这个问题,只需在 Window -> Preferences -> Run/Debug -> Console 中检查 fixed width console 如 http://code2care.org/2015/how-to-word-wrap-eclipse-console-logs-width/
中所述Image of where to check fixed width console checkbox