Что такое регулярное выражение для раскомментирования блока кода Perl в Eclipse? - PullRequest
2 голосов
/ 17 августа 2010

Мне нужно регулярное выражение, чтобы раскомментировать блок кода Perl, с комментариями # в каждой строке.

На данный момент мое выражение find в Eclipse IDE равно (^#(.*$\R)+), что соответствует закомментированному блоку, но если я передам $2 в качестве выражения замены, оно напечатает только последнюю совпавшую строку. Как удалить # при замене?

Например, мне нужно конвертировать:

# print "yes";
# print "no";
# print "blah";

до

print "yes";
print "no";
print "blah";

Ответы [ 6 ]

4 голосов
/ 17 августа 2010

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

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

^#\s*

И заменить на пустую строку.

Поскольку при этом выполняется сопоставление и замена по одной строке за раз, вы должны повторять это столько раз, сколько необходимо (в некоторых вариантах вы можете использовать глобальный флаг g, например, в Java есть пара методов replaceFirst/All вместо этого).

Ссылки

Смежные вопросы


Специальное примечание о сочетаниях клавиш Eclipse

В режиме Java Eclipse уже имеет сочетания клавиш для добавления / удаления / переключения комментариев к блоку. По умолчанию Ctrl + / привязывается к действию «Переключить комментарий». Вы можете выделить несколько строк и нажать Ctrl + /, чтобы включить или выключить комментарии блока (т. Е. //).

Вы можете нажать Ctrl + Shift + L, чтобы увидеть список всех сочетаний клавиш. В режиме Perl может быть один, чтобы переключать комментарии блока Perl #.

Смежные вопросы

2 голосов
/ 17 августа 2010

Поиск с ^#(.*$) и замена на $1

1 голос
/ 17 августа 2010

Вы можете попробовать это: -

use strict;
use warning;
my $data = "#Hello#stack\n#overflow\n";
$data =~ s/^?#//g ;

ВЫВОД: -

Hello

stack

overflow

или

open(IN, '<', "test.pl") or die $!;
read(IN, my $data, -s "test.pl"); #reading a file
$data =~ s/^?#//g ;
open(OUT, '>', "test1.pl") or die $!; 
print OUT $data; #Writing a file
close OUT;
close IN;

Примечание: позаботьтесь о #!/usr/bin/perl в скрипте Perl, это также раскомментирует его.

0 голосов
/ 19 сентября 2013

Попробуйте это регулярное выражение:

(^[\t ]+)(\#)(.*)

При такой замене:

$1$3

Группа 1 имеет значение (^ [\ t] +) и соответствует всем начальным пробелам (пробелы и символы табуляции),Группа 2 (#) соответствует одному символу #.Группа 3 - это (. *) И соответствует остальной части строки.

0 голосов
/ 17 августа 2010

Чтобы определить, является ли perl '#' комментарием или чем-то еще, вы должны скомпилировать perl и построить дерево разбора из-за Фрагмент Шварца

whatever  / 25 ; # / ; die "this dies!"; 

То, является ли '#' комментарием или частью регулярного выражения, зависит от того, является ли независимо () нулевым, что зависит от дерева разбора.

В простых случаях, однако, ваш сбой, потому что (^ # (. * $ \ R) +) повторяет группу захвата, а это не то, что вы хотели.

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

^\s*#(.*)$

? Это будет соответствовать любой строке, которая начинается с комментария (необязательно с пробелами, например, для блоков с отступом).

0 голосов
/ 17 августа 2010

Вам нужен переключатель GLOBAL g.

s /^#(.+)/$ 1 / г

...