Найти класс с методами с тем же именем

Я пытаюсь найти файлы в коде Visual Studio, содержимое которых имеет класс с методами с теми же именами. Например, следующий контент должен совпадать:

class Hello {
    ...
    function Hello() { ... }
    ...
}

В любом случае, я попытался сделать свое регулярное выражение для этого class\s([A-Za-z_]+)[^]*(function\s\1), и, похоже, оно работает нормально. Когда я пытаюсь найти файл в коде Visual Studio, он выдает ошибку: «обратные ссылки не допускаются».

Есть ли простой способ сделать то, что я хочу здесь? Мое регулярное выражение плохо сформировано?


person Tomás Juárez    schedule 30.10.2018    source источник
comment
Он плохо сформирован. Замените [^] на [\s\S\r]. Соответствует ли class\s([A-Za-z_]+)[\s\S\r]*(function\s\1) тому, что вам нужно?   -  person Wiktor Stribiżew    schedule 30.10.2018
comment
Ну, я пробовал с class\s([A-Za-z_]+)[\s\S\r]*(function\s\1), и это не работает в Visual Studio.   -  person Tomás Juárez    schedule 30.10.2018
comment
Это Visual Studio или VSCode? Я только что попробовал class\s+([A-Za-z_]+)[\s\S\r]*(function\s\1\b), и он отлично работает в Visual Studio S&R.   -  person Wiktor Stribiżew    schedule 30.10.2018
comment
Это код визуальной студии, извините   -  person Tomás Juárez    schedule 30.10.2018


Ответы (1)


Вы должны заменить [^] на [\s\S\r].

Шаблон, который должен работать,

class\s([A-Za-z_]+)[\s\S\r]*(function\s\1)

Или, возможно, более точная версия:

class\s+([A-Za-z_]+)\b[\s\S\r]*?(function\s+\1\b)
       ^            ^^         ^              ^^

Подробнее

  • class - литеральная подстрока
  • \s+ - 1 или более пробелов
  • ([A-Za-z_]+) - Группа 1: 1 или более букв или _
  • \b - граница слова
  • [\s\S\r]*? - любые 0 или более символов как можно меньше
  • (function\s+\1\b) — Группа 2: fuinction, 1+ пробел, значение группы 1 и граница слова.

введите здесь описание изображения

person Wiktor Stribiżew    schedule 30.10.2018
comment
Выглядит неплохо. В любом случае, это сработает, если вы попытаетесь найти файлы с таким содержимым? Потому что я использую регулярное выражение в контексте файлов поиска (я не пытаюсь найти внутри определенного файла), и регулярное выражение не соответствует ни одному файлу. К вашему сведению, у меня много таких файлов, так что не менее 350 должно совпадать. - person Tomás Juárez; 30.10.2018
comment
@TomásJuárez Механизм регулярных выражений «Найти в файлах» использует механизм регулярных выражений Rust, который не поддерживает обратные ссылки. Я думаю, вы не можете использовать свое регулярное выражение в поиске в файлах. Обратите внимание, что вы можете использовать ту же функцию в Notepad ++ (у него также есть диалоговое окно «Найти в файлах»). - person Wiktor Stribiżew; 30.10.2018
comment
Я пытался использовать VSCode и Atom, и ни один из них не работал. Единственный текстовый редактор, который мог найти файлы для меня таким образом, — это SublimeText 3. Итак, ваше регулярное выражение сработало как шарм. Большое спасибо за Вашу помощь! - person Tomás Juárez; 30.10.2018
comment
@ TomásJuárez Отлично, да, Suiblime Text 3 работает на базе PCRE, он будет работать с поиском и обратными ссылками. - person Wiktor Stribiżew; 30.10.2018