首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用REGEX对字符串进行复杂拆分,只丢弃空间

使用REGEX对字符串进行复杂拆分,只丢弃空间
EN

Stack Overflow用户
提问于 2021-10-14 01:00:32
回答 2查看 106关注 0票数 1

在Java (JDK 11)中,考虑以下字符串:

代码语言:javascript
复制
String hello = "333+444 5qwerty5 006 -7";

我试着想出一个RegEx,它将分割任何不是数字的东西,同时保留除空格之外的分隔符。因此,在上面的示例中,我希望得到以下数组:

代码语言:javascript
复制
["333" , "+" , "444" , "5" , "q" , "w" , "e" , "r" , "t" , "y" , "5" , "006" , "-7"]

请注意006-7中的前导零.我使用的代码如下:

代码语言:javascript
复制
String[] splited = s.split("((?<=[^0-9]+)|(?=[^0-9]+)|(\\s+))");

但是,我可以看到我的数组保留了空间。我不能为了我的生命而想出我的错误。有什么想法吗?

编辑:原来需求变得越来越复杂。最后,根据上面的示例输入,我必须获得以下集合:

代码语言:javascript
复制
["333+444" , "5" , "q" , "w" , "e" , "r" , "t" , "y" , "5" , "006" , "-7"]

因此,如果整数和运算符+ - * / % ^之间没有空格,那么就不要对它们进行拆分。我在执行这个规则时遇到了一些问题,还有一个事实,即不应该分割前导零和负数。

在此基础上,使用--第四种鸟的示例--而不是split() --进行操作非常简单,RegEx语法更容易理解、排除故障和建立在此基础上。

也许我本可以提出另一个问题,以满足额外的复杂性,但我认为使用StackOverflow继续问非常类似的问题是不对的,因为其中一个问题被困住了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-14 06:24:54

与使用split不同,您还可以匹配以下所有部件:

代码语言:javascript
复制
-?\d+|\S

模式匹配:

  • -?可选择匹配连字符
  • \d+匹配1+数字
  • |
  • \S匹配单个非空白字符

请参阅regex演示Java演示

示例

代码语言:javascript
复制
String regex = "-?\\d+|\\S";
String string = "333+444 5qwerty5 006 -7";

List<String> allMatches = new ArrayList<String>();

Matcher m = Pattern.compile(regex).matcher(string);
while (m.find()) {
    allMatches.add(m.group());
}

System.out.println(Arrays.toString(allMatches.toArray()));

输出

代码语言:javascript
复制
[333, +, 444, 5, q, w, e, r, t, y, 5, 006, -7]
票数 4
EN

Stack Overflow用户

发布于 2021-10-14 01:58:12

这适用于您的示例:

代码语言:javascript
复制
String[] split = hello.split("(?<=\\d)(?=\\D) *|(?<=[^\\d -])(?=[\\d-])|(?<=[\\d-])(?=[^\\d -])|(?<=[^\\d -])(?=[^\\d -])");

重要的部分是:

  • 使用[\\d-]代替\d,因此减号被视为“数字”
  • 通常使用[^\d -]而不是\D来防止字尾处的空拆分元素
  • 在数字后面分割,但只有在非数字跟随的情况下。
  • 在拆分时添加*以捕获(“删除”)空间
  • 非数字分裂

测试代码:

代码语言:javascript
复制
String hello = "333+444 5qwerty5 006 -7";
String[] split = hello.split("(?<=\\d)(?=\\D) *|(?<=[^\\d -])(?=[\\d-])|(?<=[\\d-])(?=[^\\d -])|(?<=[^\\d -])(?=[^\\d -])");
System.out.println(Arrays.toString(split));

输出:

代码语言:javascript
复制
[333, +, 444, 5, q, w, e, r, t, y, 5, 006, -7]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69563943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档