package com.googlecode.totallylazy.regex; import com.googlecode.totallylazy.Extractor; import com.googlecode.totallylazy.Iterators; import com.googlecode.totallylazy.functions.Function1; import com.googlecode.totallylazy.predicates.Predicate; import com.googlecode.totallylazy.Sequence; import com.googlecode.totallylazy.Sequences; import java.util.Iterator; import java.util.regex.MatchResult; import java.util.regex.Pattern; import static com.googlecode.totallylazy.Sequences.sequence; public class Regex implements Predicate<CharSequence>, Function1<CharSequence, Matches>, Extractor<CharSequence, String>{ private final Pattern pattern; private Regex(Pattern pattern) { this.pattern = pattern; } public static Regex regex(String pattern){ return new Regex(Pattern.compile(pattern)); } public static Regex regex(String pattern, int flags){ return new Regex(Pattern.compile(pattern, flags)); } public static Regex regex(Pattern pattern){ return new Regex(pattern); } public Matches findMatches(CharSequence sequence){ return new Matches(pattern, sequence); } public Sequence<String> split(CharSequence value) { return Sequences.sequence(pattern.split(value)); } @Override public boolean matches(CharSequence other) { return pattern.matcher(other).matches(); } @Override public String toString() { return pattern.pattern(); } public MatchResult match(CharSequence value) { return findMatches(value).head(); } @Override public Sequence<String> extract(CharSequence value){ return Sequences.flatten(findMatches(value).headOption().map(Matches.functions.groups)); } @Override public Matches call(CharSequence charSequence) throws Exception { return findMatches(charSequence); } public Sequence<Result> sequence(CharSequence text) { return new Sequence<Result>() { @Override public Iterator<Result> iterator() { return Iterators.flatten(new ResultIterator(pattern.matcher(text), text)); } }; } }