Java Регулярное выражение байт за байтом - PullRequest
0 голосов
/ 28 мая 2018

Я ищу способ постепенного применения шаблона регулярного выражения, т.е. я ищу средство сопоставления, которое я могу обновлять с помощью символов по мере их поступления и которое сообщает мне по каждому символу, совпадает ли он по-прежнему или нет.

Вот иллюстрация в коде (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 Ответ

0 голосов
/ 28 мая 2018

Это тот тип объекта, который вы ищете?

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();
    }

}
...