首页 > 解决方案 > 如何根据两种正则表达式格式拆分字符串?

问题描述

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

我尝试了不同的组合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]

我需要输出中的非整数组和整数组,这样我就可以以相同的格式将字符串重新连接在一起,并且使用这个输出我会丢失其他所有内容。任何帮助将不胜感激!

标签: javaregex

解决方案


问题是String.split()它只给你分隔符之间的部分。分隔符本身——匹配模式的子字符串——被省略。但是您的字符串中没有实际的分隔符。相反,您希望在数字和非数字之间的转换处进行拆分。这些可以通过零宽度断言进行匹配:

string.split("(?<![0-9])(?=[0-9])|(?<=[0-9])(?![0-9])");

那是

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

或 ( |)

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

推荐阅读