Здесь проблема:
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, чтобы обнаружить, что если обнаружено //, тогда он не будет запускать определенную строку кода.
Вы можете использовать это регулярное выражение в 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";
~
использует альтернативный разделитель регулярных выражений/{2}\s*cin\s*>>
находит экземпляры cin
с комментариями перед ними(*SKIP)(*F)
пропускает те прокомментированные матчи cin
|
чередование регулярных выражений\s*\bcin\s*>>
находит экземпляры всех uncommented cin
Он не соответствует //cin >>x
потому что ваше выражение равно /\x2F\s?cin\s?>>/
. Он начинается с одного /
закодированного в шестнадцатеричном формате (почему?), За которым следует одно или нулевое пространство и так далее.
Почему каждый использует косую черту (/
) как разделитель регулярных выражений, заключает регулярное выражение в кавычки ("
), а затем использует тонны обратных косых черт для экранирования? Функции PHP, которые работают с регулярным выражением, являются гибкими, они принимают множество символов в качестве разделителя регулярных выражений.
Регулярное выражение может быть написано так: '#//\s?cin\s?>>#'
. Теперь это более читаемо.
Смотрите демо здесь
Возможно, я не думаю обо всех случаях
Регулярное выражение есть ^(?<!\/\/) *cin
Подробно:
^
- начало строки(?<!\/\/)
является негативным взглядом*
- 0 или больше пробеловcin
- литеральный cin Отрицательный lookbehind гарантирует невозможность совпадения //
перед cin
(с или без пробела перед ним)
//[space][space]cin
? Все еще комментарий, но ваше регулярное выражение будет рассматривать его как исполняемый код ... Вместо того, чтобы искать конкретные строки, вы должны исключить ВСЕ комментарии как самое первое, что вы делаете. по-видимому, вы делаете это в цикле - перед началом цикла удалите строки с комментариями, чтобы не тратить время на выяснение того, что находится в строке, поскольку закомментированная строка кода не имеет отношения к выполнению.