私はどちらかが文字「P」が続いている場合を除き、文字「K」または「L」の後の文字列を分割したいです。サブストリングの長さは4未満ならば、文字列は場所に分割されたときにその間、私は分割しないように願っています。例えば:
- Input:
AYLAKPHKKDIV
- Expected Output
AYLAKPHK
KDIV
今、私は、文字「P」が続いているいずれかの場合を除き、文字「K」または「L」の後の分割文字列に達成しています。私の正規表現です(?<=[K|R])(?!P)
。
My result:
AYLAKPHK
K
DIV
ただし、Iは、部分文字列の長さは4未満分割位置を無視するのか分かりません。
サブストリングの長さは4未満ならば、私は、分割しないように願っています
言い換えれば、あなたがしたいです
前の試合(スプリット)に分け、現在のように、少なくとも4つの文字で試合
ABCKABKKABCD
に分割うABCK|ABKK|ABCD
にいないではなく、 `ABCK | ABK | .....少なくとも4文字の後に、現在以降の分割
ABCKAB
分割の後ABCK|AB
だろうAB
が4未満である長さの端部に。
あなたが使用できる最初の条件を達成するために、\G
前回のマッチの場所を表して(あるいはまだ試合が土器ない場合は文字列の先頭)。だから、最初の条件は次のように見ることができます(?<=\G.{4,})
(警告:subregexの通常見ビハインドを期待明白な最大の長さ、それはハンドルを、いくつかの理由のために.{4,}
私が今使用しているJavaの10で追加バグの報告と機能することができ、ここで働く場合、それは文句を言います。それは、あなたがのような2分割の間で期待する文字の最大量よりも大きくする必要がありますいくつかの非常に大きな数を使用することができます.{4,10000000}
)
それだけであるので、第2の条件は単純です(?=.{4})
。
ところで、あなたはしたくない|
で[K|R]
文字セットの任意の文字は代替選択肢で、デフォルトであるため、それは、リテラルではありませんOR演算子が表しているよう。そう[K|R]
表しK
OR |
OR 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'