'a'、'b'、および'c'のすべてを含む5文字のシーケンスに一致する正規表現は次のとおりです。
(?=.{0,4}a)(?=.{0,4}b)(?=.{0,4}c).{5}
したがって、基本的に任意の5文字(と.{5}
)を一致させる一方で、一致が遵守しなければならない3つの前提条件があります。それらのそれぞれは、トークン/文字の1つが存在する必要があります(最大4文字の後に「a」などが続きます)。(?=X)
「X、ゼロ幅の正の先読み」に一致します。ここで、ゼロ幅は、一致中に文字の位置が移動されないことを意味します。
ただし、正規表現を使用してこれを行うのは時間がかかります。より直接的なバージョンを次に示します(正規表現を使用するよりも約15倍高速のようです)。
public static void find(String haystack, String tokens, int windowLen) {
char[] tokenChars = tokens.toCharArray();
int hayLen = haystack.length();
int pos = 0;
nextPos:
while (pos + windowLen <= hayLen) {
for (char c : tokenChars) {
int i = haystack.indexOf(c, pos);
if (i < 0) return;
if (i - pos >= windowLen) {
pos = i - windowLen + 1;
continue nextPos;
}
}
// match found at pos
System.out.println(pos + ".." + (pos + windowLen - 1) + ": " + haystack.substring(pos, pos + windowLen));
pos++;
}
}