package com.netifera.platform.util.patternmatching;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex implements IPattern {
private Pattern pattern;
private final Map<Integer, String> groupNames =
new HashMap<Integer, String>();
private final Map<String, String> defaults = new HashMap<String, String>();
public static Regex caseInsensitive(final String pattern) {
return new Regex(Pattern.compile(pattern, Pattern.MULTILINE|Pattern.DOTALL|Pattern.CASE_INSENSITIVE));
}
public Regex(final String pattern) {
this(Pattern.compile(pattern, Pattern.MULTILINE|Pattern.DOTALL));
}
public Regex(final Pattern pattern) {
this.pattern = pattern;
}
@Override
public String toString() {
return pattern.toString();
}
public void add(final Integer index, final String name) {
groupNames.put(index, name);
}
public void add(final Integer index, final String name, final String defaultValue) {
add(index, name);
defaults.put(name, defaultValue);
}
public void add(final String name, final String defaultValue) {
defaults.put(name, defaultValue);
}
public boolean match(final Map<String, String> answer, final String data) {
Matcher matcher = pattern.matcher(data);
if (!matcher.matches()) return false;
fillOutAnswer(answer, matcher);
return true;
}
public Map<String, String> match(final String data) {
Matcher matcher = pattern.matcher(data);
if (!matcher.matches()) return null;
Map<String, String> answer = new HashMap<String,String>();
fillOutAnswer(answer, matcher);
return answer;
}
private void fillOutAnswer(final Map<String,String> answer, final Matcher matcher) {
for (String name: defaults.keySet()) {
answer.put(name, defaults.get(name));
}
for (Integer groupNumber: groupNames.keySet()) {
answer.put(groupNames.get(groupNumber), new String(matcher.group(groupNumber.intValue()).trim()));
}
}
}