package org.apache.commons.lang3.text; import java.util.Arrays; import org.apache.commons.lang3.StringUtils; public abstract class StrMatcher { private static final StrMatcher COMMA_MATCHER = new CharMatcher(','); private static final StrMatcher TAB_MATCHER = new CharMatcher('\t'); private static final StrMatcher SPACE_MATCHER = new CharMatcher(' '); private static final StrMatcher SPLIT_MATCHER = new CharSetMatcher(" \t\n\r\f".toCharArray()); private static final StrMatcher TRIM_MATCHER = new TrimMatcher(); private static final StrMatcher SINGLE_QUOTE_MATCHER = new CharMatcher('\''); private static final StrMatcher DOUBLE_QUOTE_MATCHER = new CharMatcher('"'); private static final StrMatcher QUOTE_MATCHER = new CharSetMatcher("'\"".toCharArray()); private static final StrMatcher NONE_MATCHER = new NoMatcher(); public static StrMatcher stringMatcher(String str) { if (StringUtils.isEmpty(str)) { return NONE_MATCHER; } return new StringMatcher(str); } public abstract int isMatch(char[] paramArrayOfChar, int paramInt1, int paramInt2, int paramInt3); static final class CharMatcher extends StrMatcher { private final char ch; CharMatcher(char ch) { this.ch = ch; } public int isMatch(char[] buffer, int pos, int bufferStart, int bufferEnd) { return this.ch == buffer[pos] ? 1 : 0; } } static final class CharSetMatcher extends StrMatcher { private final char[] chars; CharSetMatcher(char[] chars) { this.chars = ((char[])chars.clone()); Arrays.sort(this.chars); } public int isMatch(char[] buffer, int pos, int bufferStart, int bufferEnd) { return Arrays.binarySearch(this.chars, buffer[pos]) >= 0 ? 1 : 0; } } static final class NoMatcher extends StrMatcher { public int isMatch(char[] buffer, int pos, int bufferStart, int bufferEnd) { return 0; } } static final class StringMatcher extends StrMatcher { private final char[] chars; StringMatcher(String str) { this.chars = str.toCharArray(); } public int isMatch(char[] buffer, int pos, int bufferStart, int bufferEnd) { int len = this.chars.length; if (pos + len > bufferEnd) { return 0; } for (int i = 0; i < this.chars.length; pos++) { if (this.chars[i] != buffer[pos]) return 0; i++; } return len; } } static final class TrimMatcher extends StrMatcher { public int isMatch(char[] buffer, int pos, int bufferStart, int bufferEnd) { return buffer[pos] <= ' ' ? 1 : 0; } } }