package com.ghostflying.portalwaitinglist.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by Ghost on 2014/12/6.
* <br>
* The class is a util for regex used in the app.
*/
public class RegexUtil {
private static RegexUtil instance;
private static final String REGEX_PORTAL_SUBMISSION = "(?<=Ingress Portal Submitted:).+";
private static final String REGEX_PORTAL_EDIT = "(?<=Ingress Portal Edits Submitted:).+";
private static final String REGEX_INVALID_REPORT = "(?<=Invalid Ingress Portal Report:).+";
private static final String REGEX_PORTAL_SUBMISSION_PASSED = "(?<=Ingress Portal Live:).+";
private static final String REGEX_PORTAL_SUBMISSION_REJECTED = "(?<=Ingress Portal Rejected:).+";
private static final String REGEX_PORTAL_SUBMISSION_DUPLICATE = "(?<=Ingress Portal Duplicate:).+";
private static final String REGEX_PORTAL_EDIT_PASSED = "(?<=Ingress Portal Data Edit Accepted:).+";
private static final String REGEX_PORTAL_EDIT_REJECTED = "(?<=Ingress Portal Data Edit Reviewed:).+";
private static final String REGEX_EACH_JSON_IN_BATCH = "\\{.+\\}";
private static final String REGEX_FIND_BOUNDARY = "(?<=boundary=).+";
private static final String REGEX_IMG_URL = "(?<=<img src=\").+(?=\" alt)";
private static final String REGEX_ADDRESS = "(?<=z=18\">).+(?=</a>)";
private static final String REGEX_ADDRESS_URL = "https://www.ingress.com/intel.+(?=\">)";
private static final String[] REGEXS = {
REGEX_PORTAL_SUBMISSION,
REGEX_PORTAL_EDIT,
REGEX_INVALID_REPORT,
REGEX_PORTAL_SUBMISSION_PASSED,
REGEX_PORTAL_SUBMISSION_REJECTED,
REGEX_PORTAL_SUBMISSION_DUPLICATE,
REGEX_PORTAL_EDIT_PASSED,
REGEX_PORTAL_EDIT_REJECTED,
REGEX_EACH_JSON_IN_BATCH,
REGEX_FIND_BOUNDARY,
REGEX_IMG_URL,
REGEX_ADDRESS,
REGEX_ADDRESS_URL
};
static final int PORTAL_SUBMISSION = 0;
static final int PORTAL_EDIT = 1;
static final int INVALID_REPORT = 2;
static final int PORTAL_SUBMISSION_PASSED = 3;
static final int PORTAL_SUBMISSION_REJECTED = 4;
static final int PORTAL_SUBMISSION_DUPLICATE = 5;
static final int PORTAL_EDIT_PASSED = 6;
static final int PORTAL_EDIT_REJECTED = 7;
static final int EACH_JSON_IN_BATCH = 8;
static final int FIND_BOUNDARY = 9;
static final int IMG_URL = 10;
static final int ADDRESS = 11;
static final int ADDRESS_URL = 12;
private RegexPair[] regexPairs;
private Matcher matcher;
/**
* Private constructor
*/
private RegexUtil(){
regexPairs = new RegexPair[REGEXS.length];
}
/**
* Get the instance of RegexUtil
* @return the only instance of RegexUtil
*/
public static RegexUtil getInstance(){
if (instance == null)
instance = new RegexUtil();
return instance;
}
/**
* Check if the str contains the string defined by reg.
* @param reg the reg defined.
* @param str the str to search.
* @return return true if found, otherwise false.
*/
public boolean isFound(int reg, String str){
if (regexPairs[reg] == null){
regexPairs[reg] = new RegexPair(REGEXS[reg]);
}
matcher = regexPairs[reg].getPattern().matcher(str);
return matcher.find();
}
/**
* Get the last match str, must be called after {@link com.ghostflying.portalwaitinglist.util.RegexUtil#isFound(int, String)}
* @return the matched str.
*/
public String getMatchedStr(){
return matcher.group();
}
private class RegexPair{
String regex;
Pattern pattern;
public RegexPair(String regex){
this.regex = regex;
}
public Pattern getPattern(){
if (pattern == null)
compilePattern();
return pattern;
}
private void compilePattern(){
if (regex.equals(RegexUtil.REGEX_EACH_JSON_IN_BATCH)){
pattern = Pattern.compile(regex, Pattern.DOTALL);
}
else {
pattern = Pattern.compile(regex);
}
}
}
}