tl;博士
要删除任何 Unicode 代码点为零的 NULL 字符,请调用 String::replace,同时使用转义序列 CharSequence 和十六进制数为零 (\u0000) 传递单个字符 CharSequence。
input.replace( "\u0000" , "" )
详情
Java 中的String 不能包含文本和 空值,只能包含其中一个。所以我猜你使用术语null 并不意味着Java 中的空对象引用。
NULL Unicode 和 ASCII 字符
你一定是想问关于删除Unicodecode point0 被称为NULL。 (也在ASCII 中定义。)如果我的猜测是正确的,我建议您为了清楚起见编辑您的问题以避免投票。
为此,我们需要表示一个控制字符。问题是根据定义,控制字符不能出现在文本中。所以我们使用 Java 中的转义序列来通过十六进制数来识别字符。转义以反斜杠和 u 开头。
请注意,我们正在对特定文本(单字符CharSequence)进行搜索和替换。因此我们应该调用String::replace 而不是String::replaceAll,它接受一个正则表达式参数。虽然replaceAll 在技术上有效,但使用该方法无法代表我们在这里的意图并且是不合适的。
String input = … ;
String modified = input.replace( "\u0000" , "" ) ;
示例用法。
String input = "\u0000Dog\u0000Cat\u0000" ;
int lengthBefore = input.length();
String modified = input.replace( "\u0000" , "" ) ;
int lengthAfter = modified.length();
System.out.println( "lengthBefore = " + lengthBefore );
System.out.println( "lengthAfter = " + lengthAfter );
看到这个code run live at IdeOne.com。
lengthBefore = 9
lengthAfter = 6
其他途径
String::trim
String::trim 方法删除前导和尾随 whitespace 字符。它对空格的定义包括NULL 字符。请注意,我们没有删除此示例中间的 NULL,仅删除前面的 NULL 和后面的 NULL。所以长度是 7, 9-2。
"\u0000Dog\u0000Cat\u0000"
.trim()
.length()
7
如果您的字符串只包含NULL 字符,则结果为空字符串。
"\u0000"
.trim()
.length()
0
循环代码点
您可以循环文本中的每个代码点。获取IntStream(intprimitives) representing each character's code point. Test if the code point is zero (a NULL` 字符流)。
"\u0000Dog\u0000Cat\u0000"
.codePoints()
.forEach(
( int codePoint ) -> System.out.println( 0 == codePoint )
)
true
false
false
false
true
false
false
false
true