【问题标题】:Use regex for split in Java在 Java 中使用正则表达式进行拆分
【发布时间】:2019-04-04 22:01:46
【问题描述】:

我在 Java 中有字符串 IR800610000000700805312546,我需要转换为

IR80-0610-0000-0070-0805-3125-46.

我对字符串使用split,但不起作用

String[] arrayList = number.split("(\\w{4})");
StringBuilder result = new StringBuilder();
for (int i = 0; i < arrayList.length; i++) {
        result.append(arrayList[i]);
        if (i != arrayList.length - 1) {
            result.append(separator);
        }
}

我可以使用字符串格式化程序吗?

【问题讨论】:

    标签: java android regex formatting


    【解决方案1】:

    您可以使用 replaceall 而不是 split 并使用您的捕获组,后跟一个否定的前瞻来断言不是字符串 (\w{4})(?!\$) 的结尾。

    在替换中使用捕获组,后跟连字符$1-

    String number = "IR800610000000700805312546";
    number = number.replaceAll("(\w{4})(?!$)", "$1-");
    System.out.println(number); // IR80-0610-0000-0070-0805-3125-46
    

    Java demo | regex demo

    【讨论】:

    • 我的错。如果最后一个匹配是 4 个字符,则会有一个尾随破折号。使用负前瞻.{4}(?!$)
    • @JFord 你说得对,谢谢!我已经更新了答案。
    【解决方案2】:

    直接使用StringBuilder 是最简单的,无需显式拆分:

    StringBuilder result = new StringBuilder();
    String delim = "";
    for (int i = 0; i < number.length(); i += 4) {
      result.append(delim);
      delim = "-";
    
      result.append(number, i, min(i + 4, number.length()));
    }
    

    这种方法可能至少比使用正则表达式快一个数量级,因为它的工作量要少得多。

    【讨论】:

    • @RasoulMiri 你已经在使用StringBuilder 和一个循环。根本不需要将正则表达式带入其中。
    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2013-02-01
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多