如何基于两种正则表达式格式拆分字符串?

时间:2019-01-26 02:15:41

标签: java regex

我正在尝试根据两个不同的正则表达式定界符(整数和非整数)将字符串拆分为数组,但是我似乎无法获得想要的结果。

我尝试了string.split(regex)的不同组合,但没有成功。如果使用([^0-9]+),我可以将所有非整数成功地分离到其自己的数组中,但是整数会丢失。如果我尝试结合([^0-9]+)([0-9]+)进行操作,则会得到奇怪的结果,而不是所需的输出。

我的第一个尝试是按字符分割字符串,因此每个字符(不管是哪种类型)在数组string.split("")上都是不同的项目,但是我需要将数字分组在一起进行操作,并且必须保留原始字符串最后。

给出字符串:

He1l0oo, th111s is my r@nd0m 86 str1ng

输出应为:

[He], [1], [l], [0], [oo, th], [111], [s is my r@nd], [0], [m ], [86], [ str], [1], [ng]

但我只能得到:

[1], [0], [111], [0], [86], [1]

我在输出中需要非整数和整数组,因此我可以将字符串以相同的格式重新连接在一起,而在此输出中,我将失去所有其他东西。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

问题在于,item_id仅给您分隔符之间 的片段。分隔符本身(与模式匹配的子字符串)被省略。但是您的字符串中没有实际的分隔符。而是,您希望在数字和非数字之间的过渡处进行拆分。这些可以通过零宽度断言来匹配:

String.split()

那是

  • 在非数字string.split("(?<![0-9])(?=[0-9])|(?<=[0-9])(?![0-9])"); 之后和在数字(?<![0-9])之前的位置

或((?=[0-9])

  • 数字|之后和非数字(?<=[0-9])之前的位置

答案 1 :(得分:0)

尝试使用正则表达式

"(?:\\d+|\\D+)"

这匹配一组数字一个非数字的数字,但不能同时匹配这两个数字。

大致来说,代码如下所示:

Pattern pattern = Pattern.compile("(?:\\d+|\\D+)");
Matcher matcher = pattern.matcher("He1l0oo, th111s is my r@nd0m 86 str1ng");

List<String> groups = new ArrayList<>();
while (matcher.find()) {
    groups.add(matcher.group());
}

System.out.println(groups);