package com.yoursway.utils;
import static java.util.regex.Pattern.compile;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StringExtractor {
public final static Pattern WORD = compile("^\\w+");
public final static Pattern WHITESPACE = compile("^\\s+");
private String data;
private final Pattern autoSkip;
public StringExtractor(String data, Pattern autoSkip) {
if (data == null)
throw new NullPointerException("data is null");
this.data = data;
this.autoSkip = autoSkip;
}
public boolean hasMore() {
return data.length() > 0;
}
public String requireAsString(Pattern pattern) {
Matcher match = require(pattern);
return (match == null ? null : match.group());
}
public String extractAsString(Pattern pattern) {
Matcher match = extract(pattern);
return (match == null ? null : match.group());
}
public Matcher require(Pattern pattern) {
Matcher result = extract(pattern);
if (result == null)
throw new IllegalArgumentException("Pattern " + pattern + " was expected to match " + data);
return result;
}
public Matcher extract(Pattern pattern) {
Matcher matcher = pattern.matcher(data);
if (!matcher.find() || matcher.start() > 0)
return null;
String result = matcher.group();
data = data.substring(matcher.end());
if (autoSkip != null)
skip(autoSkip);
return matcher;
}
public String requireWord() {
return requireAsString(WORD);
}
public String extractWord() {
return extractAsString(WORD);
}
public void skip(Pattern pattern) {
Matcher matcher = pattern.matcher(data);
if (matcher.find() && matcher.start() == 0)
data = data.substring(matcher.end());
}
public void skipWhitespace() {
skip(WHITESPACE);
}
public void mustBeEnd() {
if (data.length() > 0)
throw new IllegalArgumentException("Extra data in the string: " + data);
}
@Override
public String toString() {
return getClass().getSimpleName() + " at �" + data + "�";
}
}