首页 > 解决方案 > 使用正则表达式拆分字母数字字符串不起作用

问题描述

我想在两个条件下拆分单词 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);

标签: javaregexstring

解决方案


你不能这样做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 中捕获

推荐阅读