在每第N个字符出现时拆分字符串

3
我需要在每四个竖线后面分割以下字符串 -
输入 -

userid456|userid457|userid458|userid459|userid460|userid461|userid462|userid463|userid464|userid465|userid466|userid467|userid468|userid469|userid470|userid471|userid472|userid473|userid474|userid475|userid476|userid477|userid478|userid479|userid480|userid481|userid482|userid483

输出 -
userid456|userid457|userid458|userid459

userid460|userid461|userid462|userid463

userid464|userid465|userid466|userid467

userid468|userid469|userid470|userid471

我正在尝试弄清楚是否有一种简单的方法使用正则表达式和String.split()函数。

等等。


2
另一种方法可能是在每个管道上进行拆分,然后重新构建输出字符串。另一种方法是运行字符搜索n次(提供上次找到的索引+1作为起始位置),并替换第n个位置的字符。 - user2864740
谢谢。但是,我正在尝试找出是否有一种单一的正则表达式方法。 - user7793464
indexOf('|', 7) + substring - PM 77-1
3个回答

1

不必使用 split,你可以使用这个正则表达式进行匹配:

(?:[^|]+\|){3}[^|]+

正则表达式演示

Java 代码:

final String regex = "(?:[^|]*\\|){3}[^|]*";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Match: " + matcher.group(0));
}

在上面的正则表达式中,只需要使用 * 而不是 + 就可以了。 - anubhava

0

你最好使用匹配而不是分割。
这样可以获得相同的效果,但更加可控。

((?:[^|]*?\|){3}[^|]*?)\||([\S\s]+)

解释:

     (                             # (1 start)
          (?:                           # Group - 3 pipes
               [^|]*?                        # Optional non-pipe chars
               \|                            # Pipe
          ){3}                          # End group 
          [^|]*?                        # Optional non-pipe chars
     )                             # (1 end)
     \|                            # 4th pipe, consume but do not capture

  |  
     ( [\S\s]+ )                   # (2), Final text less than 4 pipes

0

我能想到最接近的是这个:

String[] parts = input.split("(?<=\\G(\\w{1,11}\\|){4}+)");

这里有两个问题:

  1. 你必须在|字符之间指定最大字符数
  2. 它会在每个部分的末尾包含|

输出结果如下:

userid456|userid457|userid458|userid459|
userid460|userid461|userid462|userid463|
userid464|userid465|userid466|userid467|
userid468|userid469|userid470|userid471|
userid472|userid473|userid474|userid475|
userid476|userid477|userid478|userid479|
userid480|userid481|userid482|userid483

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接