将一系列数字从字符串转换为不同的数字

时间:2015-08-04 04:39:16

标签: java string function

我需要发生的事情是,我需要拿一个字符串

实施例

 String ln = "It's so pretty! �";

这个想法是,我们正在接受这个字符串,转换行的结尾..

�

🀽

我可以很容易地转换它,但问题可能有多个数字要改变。字符串可能是......

 String ln = "It's so pretty! �� But � �";

我需要转换该行中的每个数字..

这个代码的目的,就是这些代码中的每一个代码,对于一个角色来说都是unicode,但它是缺乏的,而且对于我需要它的目的而言并不正确。

  • 每个号码的格式相同..并且总是长5个字符。
  • 每个代码都以"&#"开头并以分号结尾。
  • 每个代码都可以在字符串中的任何位置

当我尝试创建一个转换数字的方法时,我几乎将字符串拆分为"&#"并且它适用于所有情况,除非它们没有串联连接。例如,

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();

}

我只需要一些输入。如果您愿意纠正一些事情,我很乐意接受帮助,但老实说,我对您如何解决这个问题更感兴趣。

3 个答案:

答案 0 :(得分:1)

您应该查看Regular Expressions

 Pattern pattern = Pattern.compile("&#(\\d+);");

应该可以找到字符串中的所有数字。 Matcher对象还有方法start()end()来获取匹配的偏移量,以便您可以使用这些来创建子字符串以帮助构建新的字符串

答案 1 :(得分:1)

您可以使用前瞻/后方正则表达式:"(?<=&#)(\\d+)(?=;)"进行匹配和替换。

    String ln = "Gahh it's so pretty. &#55357;&#56845;&#55357;&#56845;&#55357;&#56874;";

    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,使用MatcherPattern,您可以构建一个模式:

"&#(\\d{5});\\s?"

这将匹配您的代码,可能会或可能不会跟随空格。代码的数量被捕获到组1中,您可以将修改应用于组1。然后用新代码替换每个代码,如下所示:

public static void main(String[] args) throws Exception {
    List<String> lines = new ArrayList() {{
        add("It's so pretty! &#55357;");
        add("Gahh it's so pretty. &#55357;&#56845;&#55357;&#56845;&#55357;&#56874;");
        add("It's so pretty! &#55357;&#56357; But &#55468; &#55357;");
    }};

    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! &#127037; 
Gahh it's so pretty. &#127037; &#128525; &#127037; &#128525; &#127037; &#128554; 
It's so pretty! &#127037; &#128037; But &#127148; &#127037; 

如您所见,每个代码后都会添加空格。