Какой шаблон REGEX я должен использовать для поиска определенного строкового шаблона и удаления всего, что не соответствует? - PullRequest
0 голосов
/ 28 января 2012

Я анализирую код с помощью механизма синтаксического анализа Perl-REGEX в моей IDE , и я хочу захватить любые переменные, которые выглядят как

$hash->{ hash_key04}

, и обнулить остальныеcode ..

Пока что мой базовый REGEX не выполняет то, что я ожидал

(.*)(\$hash\-\>\{[\w\s]+\})(.*)


(
\$
hash
\-\>
\{
  [\w\s]+
\}
)

Я знаю, что использовать для этого замену ($ 1, $ 2 и т. д.), но соответствует (. *)до и после целевой строки, кажется, не захватывает весь остальной код!

ОБНОВЛЕНО: попытался сопоставить ноль, но, конечно, это слишком жадно.

([^\0]*)

Какое выражение в регулярном выражении я должен использовать, чтобы искать только строковый шаблон и удалять остальные?

Проблема в том, что я хочу остаться со списком строк $ hash -> {} после выполнения замены вIDE.

Ответы [ 5 ]

2 голосов
/ 28 января 2012

К этому лучше подходить с другой стороны. Вместо того, чтобы пытаться удалить все, что вы не хотите, как насчет извлечения всего, что вы хотите?

my @vars = $src_text =~ /(\$hash->\{[\w\s]+\})/g;

Разбиваем регулярное выражение:

    /(                  # start of capture group
       \$hash->         # prefix string with $ escaped
       \{               # opening escaped delimiter
        [\w\s]+         # any word characters or space
       \}               # closing escaped delimiter
    )/g;                # match repeatedly returning a list of captures

Вот еще один способ, который может лучше вписаться в вашу IDE:

s/(\$hash->\{[\w\s]+\})|./$1/gs;

Это регулярное выражение пытается сопоставить одну из ваших хеш-переменных в каждом месте, и в случае неудачи удаляет следующий символ, а затем повторяет попытку, которая после запуска всего файла удалит все, что вы не хотите.

0 голосов
/ 28 января 2012

Я думаю, что вы хотите добавить ^ в начало регулярного выражения s /^. (PATTERN) (. ) $ / $ 1 /, чтобы он начинался в начале строки и переходил кконец, удаляя все, кроме этого шаблона.

0 голосов
/ 28 января 2012

Зависит от вашего языка кодирования.То, что вы хотите, это группа 2 (второй набор символов в скобках).В Perl это будет $ 2, в VIM это будет \ 2 и т. Д.

0 голосов
/ 28 января 2012

По умолчанию подстановочный знак . не будет соответствовать символам новой строки.Вы можете включить новые строки в соответствующем наборе, используя флаг, в зависимости от того, какой стандарт регулярных выражений вы используете и под каким языком / API.Или вы можете добавить их самостоятельно, определив набор символов:

[.\n\r]*    <- Matches any character including newline, carriage return.

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

0 голосов
/ 28 января 2012

Это зависит от платформы, но обычно заменяют шаблон пустой строкой.

В JavaScript,

// prints "the la in ing"
console.log('the latest in testing'.replace(/test/g, ''));

В Баш

$ echo 'the latest in testing' | sed 's/test//g'
the la in ing

In C #

Console.WriteLine(Regex.Replace("the latest in testing", "test", ""));

и т.д.

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