【问题标题】:how to split a string comprised of letters and ints如何拆分由字母和整数组成的字符串
【发布时间】:2021-04-09 17:37:14
【问题描述】:

我有一个由字母后跟数字组成的字符串,例如

String s = "C34M78N8X";

我想用旁边的数字分割每个字母,这样就可以了

{"C34" "M78" "N8" "X"} //in that order

对我可以从StringInteger 使用的任何类方法有任何想法吗? 我是java的初学者,所以我正在尝试学习不同的东西。我到处研究,找不到任何东西。提前致谢

【问题讨论】:

  • "如何拆分字符串" + "关于我可以使用的任何类方法的任何想法from String" --- String.split() 方法怎么样? --- 坦率地说,我不知道如何研究如何在 Java 中拆分字符串却找不到该方法。
  • “因此我不能指定正则表达式” 为什么不呢?这正是正则表达式擅长的。或者你的意思是不能,因为你对正则表达式不够了解?如果是这样,那么您的问题表述错误。 --- “我到处研究,找不到任何东西不正确。您找到了 split() 方法,但您拒绝了它,这太糟糕了,因为它正是您所需要的。
  • 我确实说过“eg”来表明这只是一个例子。我想要一个可以与我输入的任何字符串一起使用的代码,而不是专门针对这个字符串。使用 String.split() 你必须指定一个正则表达式,但是我输入的每个字符串都有不同的字母和数字,我希望每个字母及其后面的数字都被拆分。因此,我无法在 String.split() 方法中指定正则表达式。抱歉,我应该说得更清楚。
  • 听着,我是初学者。如果我的研究没有向我展示如何按照您建议的方式使用拆分方法,我很抱歉。这是一个天真的问题,这真的不是什么大问题。无论如何感谢您的帮助。我什至投了反对票,所以现在我不能发布问题,希望能给您带来一些安心????

标签: java string split


【解决方案1】:

更新:

感谢Andreas

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String s = "C34M78N8X";
        String[] arr = s.split("(?=\\p{L})");
        System.out.println(Arrays.toString(arr));
    }
}

输出:

[C34, M78, N8, X]

\p{L}matches a letter(?=(regex)) 用于Positive Lookahead

regex101 上的正则表达式的更多解释:

原答案:

使用正则表达式 \w(?:\d+)?,您可以使用 Java 正则表达式 API 获取匹配项。

import java.util.List;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(getTokens("C34M78N8X"));

    }

    static List<String> getTokens(String textString) {
        return Pattern
                .compile("\\w(?:\\d+)?")
                .matcher(textString)
                .results()
                .map(MatchResult::group)
                .collect(Collectors.toList());
    }
}

输出:

[C34, M78, N8, X]

Stream解决方案:

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

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(getTokens("C34M78N8X"));

    }

    static List<String> getTokens(String textString) {
        List<String> matches = new ArrayList<>();
        Matcher matcher = Pattern.compile("\\w(?:\\d+)?").matcher(textString);
        
        while (matcher.find()) {
            matches.add(matcher.group());
        }

        return matches;
    }
}

通过 Lesson: Regular Expressions

了解有关 Java RegEx API 的更多信息

regex101 正则表达式的解释:

【讨论】:

  • 鉴于样本输入,一个简单的split("(?=\\p{L})")(在字母前拆分)也可以解决问题,不是吗?
【解决方案2】:

您想在两个非数字字符之间进行拆分。

您可以使用以下任意两个来做到这一点:

  • ?!\\d) 零宽度负前瞻数字
  • (?=\\D) 非数字的零宽度正向预测

所以使用(?!\\d)(?=\\D),正则表达式简单地说,“匹配你看到非数字后跟非数字的区域。

String[] data = { "ABCDEF","A12345","A1B2C3D4","AX3YM67", "A1233BB1233", "A3D456F6D" };
List<List<String>> lists = new ArrayList<>();
for (String str : data) {
    String[] st = str.split("(?!\\d)(?=\\D)");
    lists.add(Arrays.asList(st));
}

for(int i = 0; i < data.length; i++) {
    System.out.println(data[i] + " --> " +  lists.get(i));
}

打印

ABCDEF --> [A, B, C, D, E, F]
A12345 --> [A12345]
A1B2C3D4 --> [A1, B2, C3, D4]
AX3YM67 --> [A, X3, Y, M67]
A1233BB1233 --> [A1233, B, B1233]
A3D456F6D --> [A3, D456, F6, D]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多