Не могли бы вы уточнить? Я прочитал его трижды, и я думаю, что вы хотите сопоставить данный шаблон, когда он выглядит как литерал. Как не как часть комментария или строки.
То, что вы просите, довольно сложно сделать как одно регулярное выражение. Потому что вы хотите пропустить строки. Несколько строк в одной строке усложняют ситуацию.
Я бы даже не попытался сделать это за одно регулярное выражение. Вместо этого я сначала пропускаю каждую строку через фильтр, чтобы удалить строки, а затем комментирую в таком порядке. А затем попробуйте сопоставить ваш шаблон.
В Perl из-за его вычислительной мощности по регулярному выражению. Предполагая, что @lines - это список строк, которые вы хотите сопоставить, а $ pattern - это шаблон, который вы хотите сопоставить.
@matches =[];
for (@lines){
$line = $_;
$line ~= s/"[^"]*?(?<!\)"//g;
$line ~= s/'.*//g;
push @matches, $_ if $line ~= m/$pattern/;
}
Первая подстановка находит любой шаблон, который начинается с двойной кавычки и заканчивается первой неэкранированной двойной кавычкой. Использование стандартного escape-символа возврата.
Следующая полоса комментариев. Если шаблон все еще совпадает, он добавляет эту строку в список совпадений.
Он не идеален, потому что не может определить разницу между "a\\"
и "a\"
Первая обычно является допустимой строкой, а вторая - нет. В любом случае, эти замены будут продолжать искать другой ", если один не найден, строка не выбрасывается. Мы могли бы использовать другую замену, чтобы заменить все двойные обратные косые черты чем-то другим. Но это вызовет проблемы, если шаблон" В поисках содержится обратная косая черта.