Я пытаюсь расширить предложения, включающие [ ]
для обозначения необязательных, ( )
для обозначения группировки и |
для обозначения оператора or
и перечисления всех возможностей. Так, например:
"Hey [there] you [hood]."
должно вернуть четыре предложения:
Hey there you hood.
Hey there you.
Hey you hood.
Hey you.
Конечная цель будет выглядеть так:
Input: "(His|Her) dog was [very|extremely] confused."
Output: His dog was very confused.
His dog was extremely confused.
His dog was confused.
Her dog was very confused.
Her dog was extremely confused.
Her dog was confused.
Я делаю это с помощью сопоставления регулярных выражений и рекурсии. Я искал как CPAN, так и SO по фразам:
Расширение текста
расширяющиеся предложения
расширяющиеся условия
расширяющиеся опции
расширяющиеся группировки
без удачи.
Спасибо.
Я отредактировал этот вопрос в значительной степени, чтобы лучше отразить его эволюцию, и удалил большие части, которые устарели по мере эволюции вопроса. Вопрос выше - это вопрос, на который пытаются ответить большинство ответов ниже.
Мое текущее состояние следующее:
После борьбы с вышеупомянутой проблемой в течение дня у меня есть два решения, очень близких к тому, что я хочу. Один мой, а второй ниже PLT. Однако я решил попробовать принципиально иной подход.
Использование регулярных выражений и ручной синтаксический анализ этих предложений кажется очень уродливым способом ведения дел. Поэтому я решил вместо этого написать грамматику для своего «языка» и использовать генератор синтаксического анализа, чтобы разобрать ее для меня.
Это дает мне дополнительный уровень абстракции и позволяет избежать следующего сценария, описанного Дамианом Конвеем в Perl Best Practices: [about regexps]
вырезать-пасты и изменение-чуть-и-о-теперь он-не-работает-на-все-так-модификация давайте-это несколько больше, и наблюдать, если не -Вот-помогает-не-он-didn't-но-мы-поручены-теперь так может быть, если мы, с изменением что-бит вместо-хммм-that's-ближе, но все еще не -Совершенно-право-возможно-если-я сделал то-третьих, повторение-нежадным-вместо-упс-теперь это-встречно-не-соответствия-на-все-возможно-я-должен-только -post-он-к-PerlMonks.org-увидим, если-они-ноу-как там неправильно
Это также значительно облегчает изменение грамматики этих выражений, и мне нужно было позже поддержать другие конструкции.
Последнее обновление:
Я решил свою проблему с помощью набора инструментов с открытым исходным кодом . Это расшифрует версию моего ввода в формате JSGF и сгенерирует преобразователь конечного состояния. Оттуда вы можете пройти через FST, чтобы получить все возможные результаты.