RegEx с символом //

0

Здесь проблема:

int x;
int y;

//cin >>x;
cin >>y;

PHP-код:

<?php

if (preg_match_all("/\\x2F\s?cin\s?>>/", $line, $match)){
    if (preg_match_all("/\bcin\s?>>\s?\b/i", $line, $match)){
print " Correct";
}
else
print "cin,not found";
}
else
print "//cin,not found";

?>

Как это работает, например:

он будет прыгать прямо в cin>> y вместо //cin>>x с помощью RegEx.

Основная идея этого заключается в том, что я выполняю сетевую программу c++ для компилятора, всякий раз, когда студент имеет ключ в cin, тогда он выпрыгивает из окна подсказки, чтобы позволить пользователю вводить в заблуждение значение, но тогда, если тип студента код с //cin, моя программа по-прежнему будет перескакивать окно приглашения, я хочу, чтобы он использовал RegEx, чтобы обнаружить, что если обнаружено //, тогда он не будет запускать определенную строку кода.

  • 0
    Показать соответствующую часть вашей программы.
  • 1
    что если у них есть //[space][space]cin ? Все еще комментарий, но ваше регулярное выражение будет рассматривать его как исполняемый код ... Вместо того, чтобы искать конкретные строки, вы должны исключить ВСЕ комментарии как самое первое, что вы делаете. по-видимому, вы делаете это в цикле - перед началом цикла удалите строки с комментариями, чтобы не тратить время на выяснение того, что находится в строке, поскольку закомментированная строка кода не имеет отношения к выполнению.
Теги:

3 ответа

1
Лучший ответ

Вы можете использовать это регулярное выражение в PHP:

if (preg_match_all('~/{2}\s*cin\s*>>(*SKIP)(*F)|\s*\bcin\s*>>~', $line))
   print "uncommented cin found";
else
   print "uncommented cin not found";

Демо-версия RegEx

  • ~ использует альтернативный разделитель регулярных выражений
  • /{2}\s*cin\s*>> находит экземпляры cin с комментариями перед ними
  • (*SKIP)(*F) пропускает те прокомментированные матчи cin
  • | чередование регулярных выражений
  • \s*\bcin\s*>> находит экземпляры всех uncommented cin
1

Он не соответствует //cin >>x потому что ваше выражение равно /\x2F\s?cin\s?>>/. Он начинается с одного / закодированного в шестнадцатеричном формате (почему?), За которым следует одно или нулевое пространство и так далее.

Почему каждый использует косую черту (/) как разделитель регулярных выражений, заключает регулярное выражение в кавычки ("), а затем использует тонны обратных косых черт для экранирования? Функции PHP, которые работают с регулярным выражением, являются гибкими, они принимают множество символов в качестве разделителя регулярных выражений.

Регулярное выражение может быть написано так: '#//\s?cin\s?>>#'. Теперь это более читаемо.

0

Смотрите демо здесь

Возможно, я не думаю обо всех случаях

Регулярное выражение есть ^(?<!\/\/) *cin

Подробно:

  1. ^ - начало строки
  2. (?<!\/\/) является негативным взглядом
  3. * - 0 или больше пробелов
  4. cin - литеральный cin

Отрицательный lookbehind гарантирует невозможность совпадения // перед cin (с или без пробела перед ним)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню