package com.fulmicoton.multiregexp.benchmark;
import com.fulmicoton.multiregexp.MultiPattern;
import com.fulmicoton.multiregexp.MultiPatternSearcher;
import dk.brics.automaton.Automaton;
import dk.brics.automaton.AutomatonMatcher;
import dk.brics.automaton.RegExp;
import dk.brics.automaton.RunAutomaton;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public enum PatternMethods
{
MULTIPATTERN {
@Override
PatternMatchingMethod make(final List<String> patterns) {
final List<String> simplifiedPatterns = new ArrayList<>();
for (String pattern: patterns) {
final String simplifiedPattern = pattern.replaceAll("\\?:", "");
simplifiedPatterns.add(simplifiedPattern);
}
final MultiPattern multipattern = MultiPattern.of(simplifiedPatterns);
final MultiPatternSearcher searcher = multipattern.searcher();
return new PatternMatchingMethod() {
@Override
public int[] matchCounts(String txt) {
int[] matchCounts = new int[patterns.size()];
Arrays.fill(matchCounts, 0);
final MultiPatternSearcher.Cursor cursor = searcher.search(txt);
while (cursor.next()) {
matchCounts[cursor.match()] += 1;
}
return matchCounts;
}
};
}
},
JAVA {
@Override
PatternMatchingMethod make(List<String> patterns) {
final List<Pattern> compiledPatterns = new ArrayList<>();
for (final String pattern: patterns) {
compiledPatterns.add(Pattern.compile(pattern));
}
return new PatternMatchingMethod() {
private int countPattern(final Pattern pattern,
final String txt) {
final Matcher matcher = pattern.matcher(txt);
int count = 0;
while(matcher.find()) {
count++;
}
return count;
}
@Override
public int[] matchCounts(String txt) {
int[] matchCounts = new int[compiledPatterns.size()];
int patternId = 0;
for (Pattern compiledPattern: compiledPatterns) {
matchCounts[patternId] = countPattern(compiledPattern, txt);
patternId++;
}
return matchCounts;
}
};
}
},
DKU {
@Override
PatternMatchingMethod make(List<String> patterns) {
final List<RunAutomaton> compiledPatterns = new ArrayList<>();
for (final String pattern: patterns) {
final String simplifiedPattern = pattern.replaceAll("\\?:", "");
final RegExp regexp = new RegExp(simplifiedPattern);
final Automaton automaton = regexp.toAutomaton();
automaton.determinize();
final RunAutomaton runAutomaton = new RunAutomaton(automaton, true);
compiledPatterns.add(runAutomaton);
}
return new PatternMatchingMethod() {
private int countPattern(final RunAutomaton pattern,
final String txt) {
final AutomatonMatcher matcher = pattern.newMatcher(txt);
int count = 0;
while(matcher.find()) {
count++;
}
return count;
}
@Override
public int[] matchCounts(String txt) {
int[] matchCounts = new int[compiledPatterns.size()];
int patternId = 0;
for (RunAutomaton compiledPattern: compiledPatterns) {
matchCounts[patternId] = countPattern(compiledPattern, txt);
patternId++;
}
return matchCounts;
}
};
}
}
;
abstract PatternMatchingMethod make(final List<String> patterns);
public static interface PatternMatchingMethod {
public int[] matchCounts(String txt);
}
}