Вы не говорите, какой тип регулярных выражений вы используете.Я собираюсь предположить PCRE (Perl-совместимые регулярные выражения), что означает, что эти примеры не будут работать с опцией goofball «регулярные выражения» в диалоговом окне «Найти» в IDE.Однако они будут работать с любым уважающим себя инструментом grep, а также со встроенными регулярными выражениями в Perl, Ruby, .NET и многих других языках.
Вы можете начать с чего-то вроде этого:
\w+\s*\(
, который будет искать один или несколько символов слова, за которыми следуют ноль или более пробелов, а затем открывающая скобка.Это будет соответствовать:
TObject (Foo)
, но в зависимости от вашей библиотеки регулярных выражений, а также от того, какие параметры вы используете, и как вы передаете входные данные в нее, может совпадать или не совпадать, если есть разрыв строки перед открытым пареном:
TObject
(Foo)
и определенно не сработает, если между ними есть комментарий, как этот патологический случай:
X := ISomeInterface // come back and look at this cast, it's dangerous
(CurrentObj);
Но для большинства хорошо отформатированного кода это будет достаточно.
Теперь ваша проблема в том, что он дает вам больше, чем просто типы, - он также дает вам почти каждый вызов метода в вашем коде.Поэтому необходимо внести некоторые уточнения.
Если ваш код соответствует типичному стилю кодирования Delphi, то это, вероятно, будет работать намного лучше:
\b[TIE][A-Z]\w+\s*\(
и убедитесь, что вы делаете регистр символов.Это будет соответствовать любому месту, где у вас есть граница слова, за которой следует заглавная буква T (традиционный префикс для большинства классов и типов) или заглавная буква I (префикс для интерфейсов) или заглавная буква E (префикс для потомков исключений), за которым следует другая заглавная буква.буква, затем некоторое количество заглавных или строчных букв или цифр или подчеркиваний, за которыми следуют необязательные пробелы и открытое слово.Скорее всего, это то, что вам нужно.
Однако, если у вас есть имена типов, которые не соответствуют обычным соглашениям об именах (например, TfcTreeView
, в которых строчная буква послеT), или если вы когда-либо полагаетесь на нечувствительность к регистру Delphi (например, если есть вероятность, что у вас когда-либо будет код, такой как tobject(Foo)
или даже Tobject(Foo)
), то это становится сложнее.Если это так, опубликуйте некоторые подробности, и я смогу внести предложения.