RegEx для сопоставления строки между набором слов

Я пытаюсь сопоставить группу слов между двумя словами в строке. Я буду использовать Java RegEx.

Введите текст

The clever fox JUMPED OVER the big dog and ran away.

Ожидаемый результат

the big

Используемое регулярное выражение

(?<=(fox\s[A-Z0-9]*))(?s)(.*?)(?=\sdog)

Я получил результат ниже, который дает мне все слова между лисой и собакой

JUMPED OVER the big

За словом "лиса" всегда будут следовать одно или несколько слов в верхнем регистре. Мне нужно сопоставить все слова, следующие за этими двумя словами, пока я не получу "собака".

Также мне нужно получить желаемый результат в группе захвата 0. Я не могу использовать разные группы захвата. Это ограничение в моем приложении.

Любая помощь по этому поводу приветствуется.


person immzi    schedule 24.04.2014    source источник
comment
группа слов между двумя словами. Что это за два слова?   -  person    schedule 24.04.2014
comment
@Tichodromamuraria в строке примера, мне нужны все слова между словами fox JUMPED OVER и dog. Прошу прощения за мой английский, это более двух слов.   -  person immzi    schedule 24.04.2014


Ответы (3)


Вы можете использовать это регулярное выражение:

^.*fox[A-Z0-9\s]*(.*)dog.*$

Вы можете передать fox и dog параметром в своей функции для использования в других случаях.

person Andynedine    schedule 24.04.2014
comment
Это дает мне совпадающие слова в группе 1. Есть ли способ получить его в группе 0. Большое спасибо за ваш ответ - person immzi; 24.04.2014
comment
Вы можете использовать синтаксис группового игнорирования, изменив (.*) на (?=.*). Это позволяет сопоставителю игнорировать группу. - person maxdev; 24.04.2014
comment
@maxdev после внесения изменений, о которых вы сказали, я не нашел совпадений. RegEx выглядело так ^. * Fox [A-Z0-9 \ s] * (? =. *) Dog. * $ - person immzi; 24.04.2014
comment
@immzi Я получил только 1 совпадение, не так ли ?? группа 0 = большая. Какое значение вы получите в группе 0 ?? - person Andynedine; 24.04.2014
comment
@Andynedine группа 1 - большая группа 0 - Умная лиса прыгнула через большую собаку и убежала. - person Mike H-R; 24.04.2014
comment
ты прав. Ну @immzi ... Я не знаю, как ты можешь игнорировать этот махт 0. Можешь показать весь свой код, чтобы помочь тебе ?? Возможно, мы сможем найти альтернативное решение - person Andynedine; 24.04.2014
comment
@Andynedine Для этого нет java-кода. Я должен передать этот RegEx в инструмент, который выполняет дальнейшую обработку. Поэтому мне нужно, чтобы сам RegEx выдал мне подходящие слова в группе 0 - person immzi; 24.04.2014
comment
@immzi Я загрузил приложение Expresso с сайта ultrapico.com/expresso.htm и использовал регулярное выражение. Я думаю, что если вы найдете совпадение, оно всегда покажет вам вашу начальную строку, но если вы используете КНОПКУ ЗАМЕНИТЬ, вы действительно получите БОЛЬШОЙ ... Вы использовали Expresso, не так ли? - person Andynedine; 24.04.2014
comment
Да, я использую Expresso. Но это только для проверки регулярных выражений. Есть ли способ указать заменяющую строку в самом регулярном выражении. Это также решит мою проблему - person immzi; 24.04.2014
comment
Если вы используете Java: str = str.replaceAll (. * Fox [A-Z0-9 \ s] * (. *) Dog. *, $ 1); Думаю, сработает ... ВЫХОД: str = большой - person Andynedine; 24.04.2014

Боюсь, что java не не поддерживает переменную длину утверждений.

Кроме того, группа захвата 0 - это полный текст, который из-за того, что просмотр назад переменной длины не разрешен (как объяснено ранее) невозможно, если вы не знаете, что всегда будет определенная длина прописных слов.

Чтобы сделать это с группой захвата 1, попробуйте:

(?<=fox)(?:\s[A-Z0-9]*)*\s?(.*?)(?=\sdog)

РЕДАКТИРОВАТЬ: исправлена ​​опечатка в регулярном выражении

РЕДАКТИРОВАТЬ 2: прояснена проблема с полным текстом.

РЕДАКТИРОВАТЬ 3: В зависимости от того, насколько глупая java с «неочевидной максимальной длиной группы просмотра назад», это может сработать: (?<=fox(?:\s[A-Z0-9]{5,7}){1,2})(.*?)(?=\sdog), но мне нужно спросить, почему вы так уверены, что вам нужно, чтобы это была группа захвата 0? Я несколько сомневаюсь, что это так, даже если это так, вы можете просто взять результат, а затем снова запустить его для .*, чтобы получить регулярное выражение группы захвата 0, вам ни в коем случае не нужно это как требование.

person Mike H-R    schedule 24.04.2014
comment
Да, мне удалось получить желаемый текст в группе захвата 1. Но мне он нужен как полный текст, т.е. группа 0. Также пытался использовать ваше регулярное выражение, оно не дает мне желаемый текст в группе захвата 1. Не уверен, что Мне здесь ничего не хватает. Не очень разбирается в RegExes. Спасибо за предупреждение о переменной длине. - person immzi; 24.04.2014
comment
Как я уже сказал, невозможно получить полный текст в группе захвата 0 из-за того, что не разрешен просмотр назад переменной длины, извините, у меня была опечатка в регулярном выражении, теперь исправлено. - person Mike H-R; 24.04.2014
comment
Я думаю, что могу иметь минимальное и максимальное количество символов, которые будет иметь слово в верхнем регистре. Это может помочь. Допустим, например, мое слово в верхнем регистре будет иметь минимум 5 и максимум 7 символов - person immzi; 24.04.2014
comment
и может ли быть определенное количество слов? - person Mike H-R; 24.04.2014
comment
Пробовал с вашим регулярным выражением в EDIT3. Это дает мне результат как ПРЕВЫШАЮЩИЙ - person immzi; 24.04.2014
comment
при попытке я получаю сообщение об ошибке Look-behind group does not have an obvious maximum length near вы читали остальную часть? нет никакого способа, чтобы у вас было строгое требование иметь группу захвата из 0 - person Mike H-R; 24.04.2014
comment
Вы уверены, что это регулярные выражения Java? потому что вы должны получить сообщение об ошибке, если вы не получите сообщение об ошибке, попробуйте: (?<=fox(?:\s[A-Z0-9]*)*\s?)(.*?)(?=\sdog), так как это сработает, если вам разрешен просмотр назад с переменным интервалом. - person Mike H-R; 24.04.2014
comment
Да, это Java RegEx. Я использую один инструмент под названием Expresso для тестирования регулярных выражений. Это не дало ошибок для регулярного выражения в EDIT3. Что касается того, что не используется захват 1, я знаю, что этого легко добиться в Java-коде. Но мое приложение не на Java. Мне нужно передать это регулярное выражение в другое приложение, которое использует java. - person immzi; 24.04.2014
comment
Регулярное выражение EDIT3 работает в соответствии с моими потребностями, если я изменю повторение слов на точное значение 2. Но это может быть не так, у меня может быть 1 или 2. - person immzi; 24.04.2014

Без регулярного выражения:

    String fox = "The clever fox JUMPED OVER the big dog and ran away.";

    boolean start = false;
    for (String word : fox.split("\\s")) {
        if ("fox".equals(word)) {
            start = true;
            continue;
        }
        if ("dog".equals(word)) {
            break;
        }
        if (start) {
            System.out.println(word);
        }
    }
person Community    schedule 24.04.2014
comment
Мне это нужно как регулярное выражение. Мне нужно передать это в другое приложение, которое просто принимает точные слова, которые необходимо сопоставить. Не могли бы вы предложить мне что-нибудь с использованием RegEx, пожалуйста. - person immzi; 24.04.2014