java - 使用正则表达式拆分字母数字字符串不起作用
问题描述
我想在两个条件下拆分单词 1) 按空格 2) 按单词 - 以“n”开头,以“t”结尾,最后包含数字
基本上是一个付款期限
在我的情况下,以下测试用例应该通过。有人可以解释为什么正则表达式不起作用吗?
String[] splitedWords3 = new String[] {"payment","term","nt","40","net","00","net", "30"};
Assertions.assertThat("payment term nt40 net00 net30".split("n[a-z]*t\\d+|\\S+")).isEqualTo(splitedWords3);
解决方案
你不能这样做split
。你应该匹配你想要的并将它保存在List
这样的代码中:
final String regex = "\\b(n\\w*t)(\\d+)\\b|(\\S+)";
final String string = "payment term nt40 net00 net30";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);
List<String> words = new ArrayList<>();
while (matcher.find()) {
if (matcher.group(3) != null) {
words.add(matcher.group(3));
} else {
words.add(matcher.group(1));
words.add(matcher.group(2));
}
}
System.out.println(words);
输出:
[payment, term, nt, 40, net, 00, net, 30]
正则表达式详细信息:
\b
: 字边界(n\w*t)
:匹配一个以 开头的单词,n
直到我们t
在第 1 组中获取并捕获(\d+)
:匹配单词末尾的 1+ 个数字并在组 #2 中捕获\b
: 字边界|
: 或者(\S+)
: 匹配 1+ 个非空白字符并在组 #3 中捕获
推荐阅读
- javascript - Tinymce vue:如何在内部渲染 Vue 组件
- c - 通过 SPI 和 FreeRTOS 与 Pixy Cam 2 通信
- c# - 扫描值到文本框,值有'〜'所以语言是改变C#
- javascript - What type can i set to the first param of setState in typescript? how can I pass dynamiclly state object to setState?
- azure - 使用 Azure Devops 和应用中心对 Xamarin 进行发布管理
- database - PostgreSQL 上的多列索引逻辑
- r - 如何整理粘贴功能的结果?(右)
- database - 将数据插入 Cassandra 时出错
- vue.js - NuxtJs 无法在方法中调用 this.$fetch()
- ios - 如何在 SwiftUI 中从 JSON 中提取一个值字符串: