避免
如果标题措辞不当,我很抱歉,但我正在努力制作一个程序,它可以找到一种方法来检测字符串中的每个单独字符是否是控制字符。如果有一个控制字符,它应该用一组字符替换该控制字符。例如,字符串";一个/0实例";应该变成";另一个实例";,假设";其他";是我想用控制字符替换的。到目前为止,我的代码如下,但我的理解是,除了控制字符外,一个字符不能包含多个字符。
int i = 0;
char exampleCh = identifier.charAt(i);
for(i = 0; i < identifier.length(); i++){
if(Character.isISOControl(example)){
identifier = identifier.replace(exampleCh, 'exampleReplacement');
}
}
编译器处理的转义
嵌入字符串文字中的转义由编译器处理,并转换为预期字符。因此,在运行时,字符串对象包含一个null,并且不包含反斜杠和文本"an Example"
中的零。
您可以在以下代码中看到这一点。
String input = "an Example" ;
System.out.println(
Arrays.toString(
input.codePoints().toArray()
)
);
请参阅IdeOne.com上实时运行的代码。注意第三个位置的零,一个null字符,后面跟着单词"Example"的七个字符。
[97110,0,69120,97109112108101]
避免char
切勿使用char
类型。这种类型是Java2遗留下来的,基本上已经被破坏了。作为一个16位的值,char
在物理上不能表示大多数字符。
代码点
请改用代码点整数。
StringBuilder sb = new StringBuilder() ;
for( int codePoint : input.codePoints().toArray() ){
if( ! Character.isISOControl( codePoint ) ) {
sb.appendCodePoint( codePoint ) ;
}
}
String output = sb.toString() ;
转储到控制台。
System.out.println( output ) ;
System.out.println( Arrays.toString( output.codePoints().toArray() ) ) ;
}
System.out.println( output.codePoints().mapToObj( Character :: toString ).toList() ) ;
请在IdeOne.com上实时查看此代码。
示例
[97110691209109112108101]
[a,n,E,x,a,m,p,l,E]
假设我们必须遵循以下输入字符串:
String str = "an Example";
我们可以使用传统的循环和字符串生成器来替换控制字符:
String replacement = "another";
StringBuilder stringBuilder = new StringBuilder();
for (char c : str.toCharArray()) {
stringBuilder.append(Character.isISOControl(c) ? replacement : c);
}
String result = stringBuilder.toString();
或者我们可以使用流:
String result = str.chars()
.mapToObj(c -> Character.isISOControl(c) ? replacement : String.valueOf((char)c))
.collect(Collectors.joining());
请注意,根据isISOControl
方法,此an/0Example
不包含任何类型的控制字符。我相信你会想要这个