我有一个带有value-f.e的String变量:
this is test-str-ing_łóśżćń
。
我想替换这个字符:
,
-
,ł
,ó
,ś
,ż
,ć
,ń
与那些:
_
,_
,l
,o
,s
,z
,c
,n
。
我的意思是,如果解析器会发现fe:char -
(第一个列表中的第二个)应该替换为第二个列表中位于相同位置/位置的char,在本例中是:_
。
char ó
应替换为char o
。
char ń
应替换为char n
。
在我的情况下,要替换的字符列表很长,并且循环解析每个要替换的字符都不会有效。
我知道方法replaceAll()
。但它只接受String中的一个和String
所以我正在寻找方法,这将允许我处理数组/字符串列表而不是单个字符串。
请给我一些帮助。
答案 0 :(得分:3)
使用java.text.Normalizer
分解基本字母中的重音字母加上#34;组合变音符号。"
String base = Normalizer.normalize(accented, Form.NFKD)
.replaceAll("\\p{M}", "");
这会分解(D)规范化,然后删除标记。
仍需要一些替代品。
答案 1 :(得分:1)
char[] out = new char[src.length()];
for( j ...){
inputChar = src.charAt(j);
for (int i = 0; i < convertChars.length; i++) {
if (inputChar == convertChars[i]) {
inputChar = toChars[i];
}
}
}
out[j] = inputChar ;
}
out2 = new String(out);
从没有IDE的更大代码中提取,未经过测试。循环(我希望)不要分配对象,不应该降低速度。
答案 2 :(得分:0)
制作静态查询表:
private static char[] substitutions = new char[65536];
static {
// Initialize
for (char c = 0; c < substitutions.length; c++) {
substitutions[c] = c;
}
// Now add mappings.
substitions['-'] = '_'; // Map source->target character
... // Add the rest
}
// LATER IN Code
char[] stringChars = inputString.toCharArray();
for (int i = 0; i < stringChars.length; i++) {
stringChars[i] = substitutions[stringChars[i]];
}
outputString = new String(stringChars);