Java 代码无法识别 ctrl-m(^M) 但适用于其他 ctrl-字符(^Q、^A、^T 等)Linux
Java code does not recognize ctrl-m(^M) but works fine for other ctrl-characters(^Q,^A,^T etc) Linux
我有一个要求,需要从 Linux 框中的 Java 中的传入数据中删除两个特定的控制字符:^@
和 ^M
。
下面提到的部分按预期工作:
String s;
s = s.replaceAll("\x00","as");
s = s.replaceAll("\000", "as");
但这些不是:
s = s.replaceAll("\015", "as"); //Octal
s = s.replaceAll("\x0D", "as"); //Hex
我已经尝试了所有可用的表示形式 (octal/hex/unicode),包括 \r
在我的代码中表示 ^M
,但它不起作用。如上所述,其他控制字符一切正常。
如果有什么我没有尝试过或错过的,请提出建议。
编辑:按要求提供可实施代码。
public class sampSC {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("./samp1.txt"));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
line = br.readLine();
}
String s = sb.toString();
System.out.println(s);
s = s.replaceAll("\00", "sb"); //works
System.out.println(s);
s = s.replaceAll("\x11", "s23b"); //works
System.out.println(s);
s = s.replaceAll("\r$", "aa"); //doesn't work
System.out.println(s);
} finally {
br.close();
}
}
}
逐个字符而不是逐行读取怎么样?那么替换似乎微不足道。
总结一下评论:文件是用 BufferedReader.readLine()
逐行读取的。 readline 剥离了换行符 ^M (\r),因此它永远不会进入稍后搜索的 String
。
我有一个要求,需要从 Linux 框中的 Java 中的传入数据中删除两个特定的控制字符:^@
和 ^M
。
下面提到的部分按预期工作:
String s;
s = s.replaceAll("\x00","as");
s = s.replaceAll("\000", "as");
但这些不是:
s = s.replaceAll("\015", "as"); //Octal
s = s.replaceAll("\x0D", "as"); //Hex
我已经尝试了所有可用的表示形式 (octal/hex/unicode),包括 \r
在我的代码中表示 ^M
,但它不起作用。如上所述,其他控制字符一切正常。
如果有什么我没有尝试过或错过的,请提出建议。
编辑:按要求提供可实施代码。
public class sampSC {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("./samp1.txt"));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
line = br.readLine();
}
String s = sb.toString();
System.out.println(s);
s = s.replaceAll("\00", "sb"); //works
System.out.println(s);
s = s.replaceAll("\x11", "s23b"); //works
System.out.println(s);
s = s.replaceAll("\r$", "aa"); //doesn't work
System.out.println(s);
} finally {
br.close();
}
}
}
逐个字符而不是逐行读取怎么样?那么替换似乎微不足道。
总结一下评论:文件是用 BufferedReader.readLine()
逐行读取的。 readline 剥离了换行符 ^M (\r),因此它永远不会进入稍后搜索的 String
。