Преобразуйте однострочные комментарии для блокирования комментариев

В нашем случае мы раньше регистрировались в файлах проекта (.project и .classpath), чтобы облегчить для всех разработчиков создавать их рабочую область проекта. Общий предпочтительный файл и набор проекта команды были расположены в управлении исходным кодом также, так создание Вашей рабочей области было так же просто как предпочтения импорта и набор проекта команды импорта. Это работало очень хорошо, но действительно полагается на всех имеющие последовательную среду, любые настройки должны были бы быть применены после того, как основная рабочая область создается.

Мы все еще делаем это по большей части, но Знаток теперь используется поэтому, конечно, управление зависимостью обрабатывается через Знатока вместо этого. Для предотвращения конфликтующей информации .project и .classpath были удалены из управления исходным кодом и теперь сгенерированы через цели знатока, прежде чем мы импортируем набор проекта команды. Это легко допускало бы различные среды, поскольку Вам просто будут нужны сценарии для генерации IDE определенные части на основе конфигурации Знатока.

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

6
задан niton 17 April 2015 в 00:49
поделиться

2 ответа

Как уже упоминалось, « // ... » может встречаться внутри комментариев блока и строковых литералов. Поэтому, если вы создадите небольшой «синтаксический анализатор» с помощью обмана с регулярными выражениями, вы можете сначала сопоставить любую из этих вещей (строковые литералы или блочные комментарии), а затем проверить, если " // .. . ".

Вот небольшая демонстрация:

$code ='A
B
// okay!
/*
C
D
// ignore me E F G
H
*/
I
// yes!
K
L = "foo // bar // string";
done // one more!';

$regex = '@
  ("(?:\\.|[^\r\n\\"])*+")  # group 1: matches double quoted string literals
  |
  (/\*[\s\S]*?\*/)          # group 2: matches multi-line comment blocks
  |
  (//[^\r\n]*+)             # group 3: matches single line comments
@x';

preg_match_all($regex, $code, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);

foreach($matches as $m) {
  if(isset($m[3])) {
    echo "replace the string '{$m[3][0]}' starting at offset: {$m[3][1]}\n";
  }
}

, которая дает следующий результат:

replace the string '// okay!' starting at offset: 6
replace the string '// yes!' starting at offset: 56
replace the string '// one more!' starting at offset: 102

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

HTH.

3
ответ дан 17 December 2019 в 07:07
поделиться

You could try a negative look behind: http://www.regular-expressions.info/lookaround.html

## Convert Single Line Comment to Block Comments
function sinlgeLineComments( &$output ) {
  $output = preg_replace_callback('#^((?:(?!/\*).)*?)//(.*)#m',
  create_function(
    '$match',
    'return "/* " . trim(mb_substr($match[1], 0)) . " */";'
  ), $output
 );
}

however I worry about possible strings with // in them. like: $x = "some string // with slashes"; Would get converted.

If your source file is PHP, you could use tokenizer to parse the file with better precision.

http://php.net/manual/en/tokenizer.examples.php

Edit: Forgot about the fixed length, which you can overcome by nesting the expression. The above should work now. I tested it with:

$foo = "// this is foo";
sinlgeLineComments($foo);
echo $foo . "\n";

$foo2 = "/* something // this is foo2 */";
sinlgeLineComments($foo2);
echo $foo2 . "\n";

$foo3 = "the quick brown fox";
sinlgeLineComments($foo3);
echo $foo3. "\n";;
1
ответ дан 17 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: