Java Регулярное выражение байт за байтом
Я ищу способ постепенного применения шаблона регулярного выражения, то есть я ищу совпадение, которое я могу обновлять с помощью символов по мере их поступления и которое сообщает мне по каждому символу, совпадает ли он по-прежнему или нет.
Вот иллюстрация в коде (MagicMatcherIAmLookingFor
это то, что я ищу, characterSource
это то, что я могу запросить нового персонажа, скажем, InputStreamReader
в этом отношении):
final Pattern pattern = Pattern.compile("[0-9]+");
final MagicMatcherIAmLookingFor incrementalMatcher = pattern.magic();
final StringBuilder stringBuilder = new StringBuilder();
char character;
while (characterSource.isNotEOF()) {
character = characterSource.getNextCharacter();
incrementalMatcher.add(character);
if (incrementalMatcher.matches()) {
stringBuilder.append(character);
} else {
return result(
stringBuilder.toString(),
remaining(character, characterSource)
);
}
}
Я не нашел способ использовать существующий java.util.regex.Pattern
так, но, может быть, я просто не нашел его. Или есть альтернативная библиотека встроенным регулярным выражениям, которая предоставляет такую возможность?
Мне не повезло, что он искал в Интернете - все результаты полностью завалены тем, как использовать регулярные выражения java.
Я нацеливаюсь на Java 8+
1 ответ
Это тот тип объекта, который вы ищете?
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MagicMatcher {
private Pattern pattern;
private Matcher matcher;
private String stringToCheck;
public MagicMatcher(Pattern p , String s) {
pattern = p;
stringToCheck = s;
updateMatcher();
}
public boolean matches() {
return matcher.matches();
}
private void updateMatcher() {
matcher = pattern.matcher(stringToCheck);
}
public void setStringToCheck(String s) {
stringToCheck = s;
updateMatcher();
}
public String getStringToCheck() {
return stringToCheck;
}
public void addCharacterToCheck(char c) {
stringToCheck += c;
updateMatcher();
}
public void addStringToCheck(String s) {
stringToCheck += s;
updateMatcher();
}
}