首页 > 解决方案 > 如果子字符串可以转换为int,如何拆分分隔的字符串

问题描述

我试图将一个字符串拆分为一个字符串列表,该列表以字符是否可以数字转换为分隔符。换句话说,我想把我的字符串分成不同的数字和字母组。为了增加乐趣,我还尝试从每组数字中删除任何前导 0。考虑以下示例。

假设你被"aoeu01234stnh0987"作为你的输入。我想要的输出是["aoeu", "1234", "stnh", "987"]

我在下面做了一个工作示例,但它有点长且令人困惑。似乎必须有一种更好、更简洁的方法来实现这一点。

private static List<String> fragmentString(String string) {
    char[] charArr = string.toCharArray();
    StringBuilder tempStr = new StringBuilder();
    StringBuilder tempInt = new StringBuilder();
    List<String> tempList = new ArrayList<>();
    boolean wasPrevNum = false;

    for (char c : charArr) {
        boolean isNum = Character.isDigit(c);
        if (isNum) {
            tempInt.append(c);
            if (!wasPrevNum) {
                wasPrevNum = true;
                tempList.add(tempStr.toString());
                tempStr = new StringBuilder();
            }
        } else {
            tempStr.append(c);
            if(wasPrevNum) {
                while (tempInt.charAt(0) == '0') tempInt.deleteCharAt(0);
                tempList.add(tempInt.toString());
                tempInt = new StringBuilder();
                wasPrevNum = false;
            }
        }
    }
    if (tempInt.length() > 0) while (tempInt.charAt(0) == '0') tempInt.deleteCharAt(0);
    tempList.add(wasPrevNum ? tempInt.toString() : tempStr.toString());
    return tempList;
}

我看到了这篇关于使用该split()方法的帖子,但该解决方案仅适用于他们非常具体的情况,不适用于此处。该split()方法是我解决这个问题的第一件事,但我无法弄清楚一个正则表达式,现在我质疑这是否可能使用split().

标签: javaarraysstringsplit

解决方案


一个非常简单的解决方案是使用正则表达式。正则表达式,\p{L}+|[0-9]+表示字母序列或数字序列,可用于查找子字符串。然后,尝试解析找到的子字符串。如果它是一个整数,前导零将作为解析的结果被删除,如果解析失败,只需打印子字符串。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Main {
    public static void main(String[] args) {
        String str = "aoeu01234stnh0987";
        Matcher matcher = Pattern.compile("\\p{L}+|[0-9]+").matcher(str);
        while (matcher.find()) {
            String substring = matcher.group();
            try {
                System.out.println(Integer.parseInt(substring));
            } catch (NumberFormatException e) {
                System.out.println(substring);
            }
        }
    }
}

输出:

aoeu
1234
stnh
987

推荐阅读