我要在字母“ K”或“ L”之后分割字符串,除非后面都跟字母“ P”。同时,我希望当在一个位置上拆分字符串时,如果子字符串长度小于4,则不要拆分。 例如:
- Input:
AYLAKPHKKDIV
- Expected Output
AYLAKPHK
KDIV
现在,我已经实现了在字母“ K”或“ L”之后分割字符串的方法,除非后面都加上字母“ P”。我的正则表达式是(?<=[K|R])(?!P)
。
My result:
AYLAKPHK
K
DIV
但是,我不知道如何忽略子串长度小于4的拆分位置。
答案 0 :(得分:1)
如果子字符串长度小于4,我希望不要拆分
换句话说,你想要拥有
上一个匹配项(拆分)分隔为 current 匹配项,至少包含4个字符,因此ABCKABKKABCD
会拆分为ABCK|ABKK|ABCD
而不是进入“ ABCK | ABK | .....
在 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
-当您可以使用时,可能会发现逻辑更容易理解字符,而不必标识特定的位置。匹配三个或更多字符,后跟一个{K
或R
,后面不跟{{1}的P
,并确保后面至少跟四个字符的.{3,}?[KR](?!P)
,或者,如果上述整个模式均失败,则将字符串的其余部分与(?=.{4})
匹配:
.+$