特定の正規表現に準拠するすべての値のセットに対して反復子として機能するクラスを (Java で) 実装する最も簡単な方法は何ですか?
次のようなクラスがあるとしましょう。
public class RegexpIterator
{
private String regexp;
public RegexpIterator(String regexp) {
this.regexp = regexp;
}
public abstract boolean hasNext() {
...
}
public abstract String next() {
...
}
}
どうすれば実装できますか? このクラスは、適合するすべての値のセットに対して何らかの線形順序付けを想定しており、next() メソッドは i 回目に呼び出されたときに i 番目の値を返す必要があります。
理想的には、ソリューションは (Java SDK でサポートされているように) 完全な正規表現構文をサポートする必要があります。
混乱を避けるために、クラスは、指定された文字列に対して指定された正規表現の一致を反復することは想定されていないことに注意してください。むしろ、引数として他の入力文字列を指定せずに、(最終的に) 正規表現に準拠する (つまり、マッチャーの matches() メソッドによって受け入れられる) すべての文字列値を列挙する必要があります。
質問をさらに明確にするために、簡単な例を示しましょう。
RegexpIterator it = new RegexpIterator("ab?cd?e");
while (it.hasNext()) {
System.out.println(it.next());
}
このコード スニペットには次の出力が含まれている必要があります (短い文字列を最初にリストするソリューションが優先されますが、行の順序は関係ありません)。
ace
abce
ecde
abcde
ab[A-Z]*cd
などの一部の正規表現では、クラスが反復する値のセットが無限であることに注意してください。このような場合、前のコード スニペットは永久に実行されます。