【问题标题】:What is the way to insert a colon(:) after every two characters in a string?在字符串中的每两个字符之后插入冒号(:) 的方法是什么?
【发布时间】:2014-05-01 08:35:31
【问题描述】:

我正在试图弄清楚 -

输入: String data = "506313B5EA3E";

输出: String data = "50:63:13:B5:EA:3E";

我尝试使用-

java.util.Arrays.toString(data.split("(?<=\\G..)"))

但是输出是:[50, 6313B5EA3E]

【问题讨论】:

  • 你可以用老式的方法来循环字符串

标签: java string split


【解决方案1】:

您可以使用正则表达式:

String input = "0123456789abcdef";
String output = input.replaceAll("..(?!$)", "$0:")
// output = "01:23:45:67:89:ab:cd:ef"

它是如何工作的?

  • .. 正好匹配两个字符。 (?!$) 确保这两个字符不在input 的末尾(?! 是负前瞻,$ 代表结尾)。
  • 匹配的两个字符现在将替换为它们自己($0 表示整个匹配字符串)和我们想要的冒号。
  • 因为我们使用的是replaceALL,所以这个操作对每两个字符组重复。记住:除了最后一个。

【讨论】:

  • 你能为你的正则表达式添加解释吗?
【解决方案2】:

两个涉及循环的简单选项,都假设您已经检查了输入是非空的并且有偶数个字符:

使用 StringBuilder

StringBuilder builder = new StringBuilder(data.length() * 3 / 2 - 1);
for (int i = 0; i < data.length(); i += 2) {
    if (i != 0) {
        builder.append(":");
    }
    builder.append(data.substring(i, i + 2));
}
String text = builder.toString();

使用字符数组

char[] output = new char[data.length() * 3 / 2 - 1];
int outputIndex = 0;
for (int i = 0; i < data.length(); i += 2) {
    if (i != 0) {
        output[outputIndex++] = ':';
    }
    output[outputIndex++] = data.charAt(i);
    output[outputIndex++] = data.charAt(i + 1);
}
String text = new String(output);

另一种选择是使用Guava 中的Joiner 以及之前的拆分:

String text = Joiner.on(':').join(data.split("(?<=\\G..)"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2020-03-04
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多