【问题标题】:Split String at different lengths in Java在Java中以不同长度拆分字符串
【发布时间】:2017-11-29 05:14:05
【问题描述】:

我想在一定长度后分割一个字符串。

假设我们有一串“消息”

123456789

这样拆分:

"12" "34" "567" "89"

我想先将它们分成 2 个使用

"(?<=\\G.{2})" 

Regexp,然后加入最后两个并再次拆分为 3,但是有什么方法可以使用 RegExp 一次性完成。请帮帮我

【问题讨论】:

  • 我的意思是你想分割长度为 2、4 和 7 ??
  • 我不知道不同长度的正则表达式,但你可以在任何循环中使用子字符串来做到这一点。
  • 是否有类似 2,2,3,2,2,3.... 的长度模式??
  • 您需要说明您想要查找的模式或想要匹配的分隔符的常规。没有它,我们无法真正帮助您使用正则表达式来解决您的问题。
  • @Pshemo 就像上面的例子有很多字符串,我想把它们分成 2,2,3,2 长度,每个字符串正好有 9 个数字,这就是模式。跨度>

标签: java regex split


【解决方案1】:

使用^(.{2})(.{2})(.{3})(.{2}).*(在regex101 中查看它的实际操作)将字符串分组为指定长度并将组作为单独的字符串获取

  String input = "123456789";
  List<String> output = new ArrayList<>();

  Pattern pattern = Pattern.compile("^(.{2})(.{2})(.{3})(.{2}).*");
  Matcher matcher = pattern.matcher(input);

  if (matcher.matches()) {
     for (int i = 1; i <= matcher.groupCount(); i++) {
         output.add(matcher.group(i));
     }
  }

  System.out.println(output);

注意:组捕获从 1 开始,因为组 0 匹配整个字符串

还有来自@YCF_L 的来自评论的壮丽魔法

  String pattern = "^(.{2})(.{2})(.{3})(.{2}).*";
  String[] vals = "123456789".replaceAll(pattern, "$1-$2-$3-$4").split("-");

这里的神奇之处在于您可以用replaceAll() 方法替换捕获的组。 使用 $n(其中 n 是一个数字)来引用捕获的子序列。请参阅此 stackoverflow question 以获得更好的解释。

注意:这里假设没有输入字符串包含-。 如果是这样,然后找到任何其他字符不会出现在任何 您的输入字符串,以便它可以用作分隔符。

【讨论】:

  • 你是个巫师@YCF_L :D 向你致敬!
  • 是的。虽然我是这么认为的。但最好提一下。谢谢。
【解决方案2】:

使用123456789 测试字符串在regex101 中测试此正则表达式。

^(\d{2})(\d{2})(\d{3})(\d{2})$

输出:

Match 1
Full match  0-9 `123456789`
Group 1.    0-2 `12`
Group 2.    2-4 `34`
Group 3.    4-7 `567`
Group 4.    7-9 `89`

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多