在Java中拆分字符串:以指定的长度向后看

时间:2018-11-15 09:30:15

标签: java regex

我要在字母“ K”或“ L”之后分割字符串,除非后面都跟字母“ P”。同时,我希望当在一个位置上拆分字符串时,如果子字符串长度小于4,则不要拆分。 例如:

- Input:
AYLAKPHKKDIV

- Expected Output
AYLAKPHK
KDIV

现在,我已经实现了在字母“ K”或“ L”之后分割字符串的方法,除非后面都加上字母“ P”。我的正则表达式是(?<=[K|R])(?!P)

My result:
AYLAKPHK
K
DIV

但是,我不知道如何忽略子串长度小于4的拆分位置。

My Demo

2 个答案:

答案 0 :(得分:1)

  

如果子字符串长度小于4,我希望不要拆分

换句话说,你想要拥有

  1. 上一个匹配项(拆分)分隔为 current 匹配项,至少包含4个字符,因此ABCKABKKABCD会拆分为ABCK|ABKK|ABCD而不是进入“ ABCK | ABK | .....

  2. current 分割后至少4个字符,因为分割ABCKAB之后的ABCK|AB在结尾处的AB长度小于4。

要获得第一个条件,您可以使用\G来表示先前匹配的位置(如果尚未找到匹配项,则为字符串的开头)。因此,第一个条件可能看起来像(?<=\G.{4,})(警告:通常,后面看起来期望它处理的subregex的最大最大长度,但是由于某些原因,.{4,}在这里工作,可以是Java 10中的错误或功能添加,我现在正在使用,以防万一,您可以使用一些很大的数字,该数字应该大于两次拆分之间的最大字符数,例如.{4,10000000}

第二个条件比较简单,因为它只是(?=.{4})

顺便说一句,您不希望|中的[K|R]因为它表示文字,而不是OR运算符,因为默认情况下,字符集中的任何字符都是替代选择。因此[K|R]代表K|R。请改用[KR]

演示:

String text = "AYLAKPHKKKKKKDIVK123KAB";
String regex = "(?<=[KR])(?!P)(?<=\\G.{4,})(?=.{4})";
for (String s : text.split(regex)){
    System.out.println("'"+s+"'");
}

输出:

'AYLAKPHK'
'KKKK'
'KDIVK'
'123KAB'

答案 1 :(得分:0)

如果可能的话,您可以使用matcher来匹配每个子字符串,而不是split-当您可以使用时,可能会发现逻辑更容易理解字符,而不必标识特定的位置。匹配三个或更多字符,后跟一个{KR,后面不跟{{1}的P,并确保后面至少跟四个字符的.{3,}?[KR](?!P) ,或者,如果上述整个模式均失败,则将字符串的其余部分与(?=.{4})匹配:

.+$