C # и регулярное выражение для подстановки слов с вложенными тегами - PullRequest
0 голосов
/ 11 марта 2009

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

По сути, я пытаюсь сделать следующее:

<{Hello | Hi | Howdy}> мир.

и превратить его в это:

 Hello world.
OR
 Hi world.
OR
 Howdy world.

Пока все хорошо. Google дало мне достаточно, чтобы иметь возможность успешно извлечь внутренний текст между <{и}> в массив, из которого я затем случайным образом выбираю слово для замены полного <{Hello | Hi | Howdy}>.

У меня проблема с синтаксическим анализом вложенного набора слов, заключенных в те же теги.

Например, если я начну с этого:

<{Hello | Hi | Howdy}> мир. <{Как <{жизнь | как дела}>? | Как дела?}>

Я бы хотел превратить это в следующее:

 Hello world. How's life?
OR
 Hello world. How's it going?
OR
 Hello world. How are you?

и так далее ...

Может ли кто-нибудь предложить способ сделать это довольно просто, используя c # и регулярное выражение?

Я смотрел на http://www.vsj.co.uk/articles/display.asp?id=789 и http://www.m -8.dk / resources / RegEx-balancing-group.aspx , и, честно говоря, многое из этого пошло по моей голове, так что что-то простое было бы хорошо. ; -)

Спасибо.

Ответы [ 4 ]

0 голосов
/ 11 марта 2009

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

Контекстно-свободные грамматики строго более мощны, чем регулярные выражения:

  • Любой язык, который может быть сгенерирован с использованием регулярных выражений, может быть создан с помощью контекстно-свободной грамматики.
  • Существуют языки, которые могут генерироваться грамматикой без контекста, которая не может быть создана никаким регулярным выражением.

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

0 голосов
/ 11 марта 2009

Если у вас есть регулярное выражение, которое может правильно проанализировать значения внутри вашего тега в массив (назовите его A '), то для каждого значения в A' повторно примените это регулярное выражение.

Вы должны быть в состоянии сделать это рекурсивно.

0 голосов
/ 11 марта 2009

Эта проблема плохо подходит для регулярных выражений. Грамматика, необходимая для распознавания описанного вами выражения, не является обычной грамматикой .

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

Вы должны быть в состоянии эффективно проанализировать это с помощью LL (1) парсера . Я бы сказал, что проблема лучше подходит для токенизации ввода с использованием lex и построения абстрактного синтаксического дерева с использованием yacc.

Вот учебник по Грамматика и синтаксический анализ с C #

0 голосов
/ 11 марта 2009

В Visual Studio SDK есть lex и yacc:

Эти ссылки могут помочь:

http://msdn.microsoft.com/en-us/library/bb165963(VS.80).aspx

http://devhawk.net/2006/09/17/Managed+Lex+And+Yacc.aspx

В зависимости от того, насколько сложным будет ваш анализ (учитывая возможные будущие изменения и дополнения), вы можете просто захотеть использовать Regex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...