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

时间:2017-03-30 18:21:34

标签: java regex split

我需要在每第四个管道之后拆分一个像下面这样的字符串 -

输入 -

  

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

试图找出使用regexp和String.split()的简单方法

3 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式使用匹配项来代替使用split

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

RegEx Demo

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));
}

答案 1 :(得分: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

答案 2 :(得分:0)

我能想出的最接近的是:

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

这有两个问题:

  1. 您必须指定 | 字符
  2. 之间的最大字符数
  3. 它将在每个部分的末尾包含 |
  4. 输出如下:

    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