package com.fulmicoton.multiregexp;
import dk.brics.automaton.Automaton;
import dk.brics.automaton.RegExp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MultiPattern {
private final List<String> patterns;
private MultiPattern(List<String> patterns) {
this.patterns = new ArrayList<>(patterns);
}
public static MultiPattern of(List<String> patterns) {
return new MultiPattern(patterns);
}
public static MultiPattern of(String... patterns) {
return new MultiPattern(Arrays.asList(patterns));
}
public MultiPatternAutomaton makeAutomatonWithPrefix(String prefix) {
final List<Automaton> automata = new ArrayList<>();
for (final String ptn: this.patterns) {
final String prefixedPattern = prefix + ptn;
final Automaton automaton = new RegExp(prefixedPattern).toAutomaton();
automaton.minimize();
automata.add(automaton);
}
return MultiPatternAutomaton.make(automata);
}
/**
* Equivalent of Pattern.compile, but the result is only valid for pattern search.
* The searcher will return the first occurrence of a pattern.
*
* This operation is costly, make sure to cache its result when performing
* search with the same patterns against the different strings.
*
* @return A searcher object
*/
public MultiPatternSearcher searcher() {
final MultiPatternAutomaton searcherAutomaton = makeAutomatonWithPrefix(".*");
final List<Automaton> indidivualAutomatons = new ArrayList<>();
for (final String pattern: this.patterns) {
final Automaton automaton = new RegExp(pattern).toAutomaton();
automaton.minimize();
automaton.determinize();
indidivualAutomatons.add(automaton);
}
return new MultiPatternSearcher(searcherAutomaton, indidivualAutomatons);
}
/**
* Equivalent of Pattern.compile, but the result is only valid for full string matching.
*
* If more than one pattern are matched, with a match ending at the same offset,
* return all of the pattern ids in a sorted array.
*
* This operation is costly, make sure to cache its result when performing
* search with the same patterns against the different strings.
*
* @return A searcher object
*/
public MultiPatternMatcher matcher() {
final MultiPatternAutomaton matcherAutomaton = makeAutomatonWithPrefix("");
return new MultiPatternMatcher(matcherAutomaton);
}
}