在每个第 i 个和第 j 个字符处拆分

wan*_*Dev 3 java regex split

我需要在每个第 i 个和第 j 个字符处拆分一个字符串,其中 i 和 j 可以根据输入参数进行更改。例如,如果我有一个输入

String s = "1234567890abcdef";
int i = 2;
int j = 3;
Run Code Online (Sandbox Code Playgroud)

我希望我的输出是一个数组:

[12, 345, 67, 890, ab, cde, f]
Run Code Online (Sandbox Code Playgroud)

我找到了一个紧凑的正则表达式,可以在每个第 n 个字符处进行拆分。n = 3 的示例使用"(?<=\\G...)""(?<=\\G.{3})"

String s = "1234567890abcdef";
int n = 3;
System.out.println(Arrays.toString(s.split("(?<=\\G.{"+n+"})")));

//output: [123, 456, 789, 0ab, cde, f]
Run Code Online (Sandbox Code Playgroud)

如何修改上面的正则表达式以交替拆分每个第 2 个第 3 个字符?

天真的链接像"(?<=\\G.{2})(?<=\\G.{3})"不起作用。

hor*_*rux 5

我不认为你可以用 来做到这一点split(),因为每个匹配都应该知道之前匹配的模式。

如果您不想手动迭代字符串的字符,则可以使用以下内容:

Matcher m = Pattern.compile("(.{0,2})(.{0,3})").matcher("1234567890abcdef");
List<String> list = new ArrayList<>();
while (m.find()) {
  for (int i = 1; i <= 2; i++) {
    if (!m.group(i).isEmpty()) {
      list.add(m.group(i));
    }
  }
}
System.out.println(list);  // prints [12, 345, 67, 890, ab, cde, f]
Run Code Online (Sandbox Code Playgroud)

  • 是的,在这种情况下,请记住将“i &lt;= 2”替换为“i &lt;= 3”(或使用“m.groupCount()”)。 (2认同)