Java Regexp: флаг UNGREEDY - PullRequest
       9

Java Regexp: флаг UNGREEDY

0 голосов
/ 12 октября 2009

Я бы хотел перенести универсальный инструмент для обработки текста, Texy! , с PHP на Java.

Этот инструмент везде делает несоответствующее сопоставление, используя preg_match_all("/.../U"). Поэтому я ищу библиотеку, в которой есть какой-то флаг UNGREEDY.

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

Я проверил

  • ORO - кажется, заброшен
  • Jakarta Regexp - без поддержки
  • java.util.regex - без поддержки

Есть ли такая библиотека?

Спасибо, Ондра

Ответы [ 4 ]

3 голосов
/ 12 октября 2009

Обновление: После проверки документов я обнаружил флаг LAZY, что является еще одним термином для нежадных. Однако он доступен только в OpenJDK

p = Pattern.compile("your regex here", LAZY);
p.matcher("string to match")

Оригинальный устаревший ответ Я, честно говоря, не думаю, что есть один.

Весь смысл +? а также *? чтобы вы могли выбирать, какие разделы делать жадно, а какие лениво.

Жадность - это поведение по умолчанию, потому что это наиболее часто используемые + и * в регулярных выражениях. На самом деле я не могу думать об одном парсере регулярных выражений, который делает это наоборот. Например, когда модификатор используется для создания чего-то жадного, и по умолчанию используется ленивое соответствие.

Я знаю, что это не тот ответ, который вы ищете, но я думаю, что единственный способ заставить вас работать - добавить? на ваши * и +. С другой стороны, вы можете использовать регулярные выражения, чтобы определить, какие из них необходимо изменить. Или даже внести изменения для вас, если все они должны быть изменены. Или, если вы можете, можете описать шаблон, который определяет, что необходимо изменить.

1 голос
/ 12 октября 2009

Вы можете использовать 'com.caucho.quercus.lib.regexp.JavaRegexpModule'. Quercus - это Java-реализация PHP , а в библиотеке regex реализован синтаксис и имена методов PHP regex .

1 голос
/ 12 октября 2009

Я предлагаю вам создать свою собственную измененную библиотеку Java. Просто скопируйте исходный код java.util.regex в свой собственный пакет.

Класс Sun JDK 1.6 Pattern.java предлагает следующие флаги по умолчанию:

static final int GREEDY     = 0;

static final int LAZY       = 1;

static final int POSSESSIVE = 2;

Вы заметите, что эти флаги используются только пару раз, и их было бы тривиально изменить. Возьмите следующий пример:

    case '*':
        ch = next();
        if (ch == '?') {
            next();
            return new Curly(prev, 0, MAX_REPS, LAZY);
        } else if (ch == '+') {
            next();
            return new Curly(prev, 0, MAX_REPS, POSSESSIVE);
        }
        return new Curly(prev, 0, MAX_REPS, GREEDY);

Просто измените последнюю строку, чтобы использовать флаг 'LAZY' вместо флага GREEDY. Поскольку вы хотите, чтобы библиотека регулярных выражений вела себя как библиотека PHP, это может быть лучшим способом.

1 голос
/ 12 октября 2009

Что касается идеи проверки и перепроверки всех регулярных выражений, уверены ли вы, что библиотеки php и java достаточно согласны с синтаксисом, что вам не придется делать это в любом случае? Сначала я прошёл бы их все, написал несколько тестов (входных и выходных) и убедился, что они работают одинаково в обеих реализациях. Затем придумайте способ их автоматического запуска, и вы будете защищены для будущих обновлений и несовместимостей. Вам все равно нужно будет что-то настроить, но, по крайней мере, вы будете знать, где.

...