我需要发生的事情是,我需要拿一个字符串
实施例
String ln = "It's so pretty! �";
这个想法是,我们正在接受这个字符串,转换行的结尾..
�
到
🀽
我可以很容易地转换它,但问题可能有多个数字要改变。字符串可能是......
String ln = "It's so pretty! �� But � �";
我需要转换该行中的每个数字..
这个代码的目的,就是这些代码中的每一个代码,对于一个角色来说都是unicode,但它是缺乏的,而且对于我需要它的目的而言并不正确。
当我尝试创建一个转换数字的方法时,我几乎将字符串拆分为"&#"并且它适用于所有情况,除非它们没有串联连接。例如,
String ln = "Gahh it's so pretty. ������";
它将解决该字符串,并转换所有数字,并且可以重新创建原始字符串,只需修改数字。但它不会重新创建一个字符串,数字代码之间会有间隙。
这是我使用的代码..就像我说的那样,它只是在一种情况下转换为它应该的,并且我还没有弄清楚如何使它适用于所有情况。
public static void main(String args[]) {
String ln = "Gahh it's so pretty. ������";
//71680 + code present
//Gahh it's so pretty. ������
String tmp = ln;
String[] codes = tmp.split("&#");
System.out.println(ln);
ArrayList<Integer> ids = new ArrayList<>();
for (int i = 0; i < codes.length; i++) {
codes[i] = codes[i].trim();
if (codes[i].length() != 6)
continue;
if (codes[i].endsWith(";")) {
codes[i] = codes[i].substring(0, codes[i].length()-1);
}
try {
ids.add(Integer.parseInt(codes[i]) + 71680);
} catch (NumberFormatException e) {
System.err.println("Error in conversion: " + codes[i]);
}
}
//System.out.println(Arrays.toString(codes));
codes = tmp.split("&#\\d{5}");
//System.out.println(Arrays.toString(codes));
for (int i = 0; i < codes.length; i++) {
//System.out.println(codes[i]);
if (codes[i].equals(";")) {
codes[i] = "&#"+ids.remove(0)+";";
}
}
for (String s : codes)
System.out.print(s);
System.out.println();
}
我只需要一些输入。如果您愿意纠正一些事情,我很乐意接受帮助,但老实说,我对您如何解决这个问题更感兴趣。
答案 0 :(得分:1)
您应该查看Regular Expressions
Pattern pattern = Pattern.compile("&#(\\d+);");
应该可以找到字符串中的所有数字。 Matcher对象还有方法start()
和end()
来获取匹配的偏移量,以便您可以使用这些来创建子字符串以帮助构建新的字符串
答案 1 :(得分:1)
您可以使用前瞻/后方正则表达式:"(?<=&#)(\\d+)(?=;)"
进行匹配和替换。
String ln = "Gahh it's so pretty. ������";
Pattern patt = Pattern.compile("(?<=&#)(\\d+)(?=;)");
Matcher mat = patt.matcher(ln);
StringBuffer buf = new StringBuffer();
while(mat.find()) {
mat.appendReplacement(buf, Integer.toString(Integer.parseInt(mat.group(1)) + 71680));
}
mat.appendTail(buf);
System.out.println(buf.toString());
答案 2 :(得分:1)
使用Regex
,使用Matcher
和Pattern
,您可以构建一个模式:
"&#(\\d{5});\\s?"
这将匹配您的代码,可能会或可能不会跟随空格。代码的数量被捕获到组1中,您可以将修改应用于组1。然后用新代码替换每个代码,如下所示:
public static void main(String[] args) throws Exception {
List<String> lines = new ArrayList() {{
add("It's so pretty! �");
add("Gahh it's so pretty. ������");
add("It's so pretty! �� But � �");
}};
for (String ln : lines) {
Matcher matcher = Pattern.compile("&#(\\d{5});\\s?").matcher(ln);
while (matcher.find()) {
int number = Integer.parseInt(matcher.group(1)) + 71680;
ln = ln.replace(matcher.group(0), "&#" + number + "; ");
}
System.out.println(ln);
}
}
结果:
It's so pretty! 🀽
Gahh it's so pretty. 🀽 😍 🀽 😍 🀽 😪
It's so pretty! 🀽 🐥 But 🂬 🀽
如您所见,每个代码后都会添加空格。