English Русский Deutsch Български Français Español

Часто задаваемые вопросы

Я обнаружил ужасную ошибку: TRegExpr вызывает исключение Access Violation!

Ответ

Вы должны создать объект перед использованием. Итак, после того, как вы объявили что-то вроде:

r: TRegExpr

не забудьте создать экземпляр объекта:

r: = TRegExpr.Create.

Регулярные выражения с (? = …) не работают

Look-ahead не реализованы в TRegExpr. Но во многих случаях вы можете легко заменить их простыми подвыражениями.

Поддерживает ли он Юникод?

Ответ

Как использовать Юникод

Почему TRegExpr возвращает более одной строки?

Например, регулярное выражение <font .\*> возвращает первый же <font, далее весь последующий текст до финального``</html>``.

Ответ

Для обратной совместимости модификатор /s по умолчанию Вкл.

Выключите его, и . будет соответствовать любому символу, кроме Разделителей строк - именно так, как вы хотите.

Я лично предлагаю <font ([^\n>] *)>, тогда в Match [1] будет URL.

Почему TRegExpr возвращает больше, чем я ожидаю?

Например <p> (. +) </p> для строки <p>a </p><p> b </p> возвращает a </p><p> b но не a, как ожидается.

Ответ

По умолчанию все операторы работают в жадном режиме, поэтому они совпадают как можно больше.

Если вам нужен режим не жадный режим, вы можете использовать не жадные варианты операторов, такие как +? и т. д., или переключить все операторы в не жадный режим с помощью модификатора g (используйте соответствующие свойства TRegExpr или оператор ?(-g) внутри выражения).

Как анализировать HTML, с помощью TRegExpr?

Ответ

Извините, ребята, но это почти невозможно!

Конечно, вы можете легко использовать TRegExpr для извлечения некоторой информации из HTML, как показано в моих примерах, но если вам нужен точный синтаксический анализ, вы должны использовать полноценный парсер, а не

Вы можете прочитать полное объяснение в Том Кристиансен и Натан Торкингтон Perl Cookbook, например.

Вкратце - есть много структур, которые могут быть легко проанализированы реальным парсером, но не могут быть проанализированы регулярными выражениями. Полноценный парсер намного быстрее выполнит синтаксический анализ.

Есть ли способ получить несколько совпадений шаблона на TRegExpr?

Ответ

Вы искать последующие совпадения с помощью метода ExecNext.

Если вам нужен какой-то пример, посмотрите на реализацию метода TRegExpr.Replace или на примеры для HyperLinksDecorator

Я проверяю пользовательский ввод. Почему TRegExpr возвращает True для неправильных входных строк?

Ответ

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

Так, например, выражение \d{4,4} совпадет и с 12345 и с любые буквы 1234.

Вы должны проверить от начала строки до конца строки, чтобы убедиться, что вокруг ничего больше нет: ^\d{4,4}$.

Почему не жадные итераторы иногда работают в жадном режиме?

Например, a+?,b+?, для строки aaa,bbb, найдет aaa,b, но не a,b хотя первый итератор не жаден?

Ответ

Регулярные выражения только ищут первое же совпадение и не пытаются найти «наилучшее» совпадение.

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

Основное правило - сначала пытаемся найти соотвествие, начиная с текущей позиции в строке и, только если это невозможно, продвигаемся на один символ вперед и попробуем снова со следующей позиции в тексте.

Если вы используете a,b+? то это будет соответствовать a,b. В случае a+?,b+?, не смотря на не жадный модификатор, все же возможно захватить более одного a, поэтому TRegExpr сделает это.

Регулярные выражения, не пытаются двигаться дальше по тексту и проверять - удастся ли найти «лучшее» совпадение. Хотя бы потому, что нельзя сказать, что такое «лучше».

Как использовать TRegExpr с Borland C ++ Builder?

У меня проблема, нет файла заголовка (.h или .hpp).

Ответ

  • Добавьте RegExpr.pas к проекту bcb.
  • Скомпилировать проект. Это создает заголовочный файл RegExpr.hpp.
  • Теперь вы можете писать код, использующий модуль RegExpr.
  • Не забудьте добавить #include “RegExpr.hpp” там, где это необходимо.
  • Не забудьте заменить все \ в регулярных выражениях на \ или переопределить EscChar const.

Почему многие примеры (включая примеры из документации) работают неправильно в Borland C ++ Builder?

Ответ

Подсказка есть в предыдущем вопросе;) Символ \ имеет особое значение в C ++, поэтому вы должны эскейпить его (как описано в предыдущем ответе). Но если вам не нравится, как выглядит \w+\\w+\.\w+, вы можете переопределить константу EscCharRegExpr.pas). Скажем, EscChar = "/". Затем вы можете написать /w+/w+/. /W+ - выглядит необычно, но более читабельно.