read()
потребляет. Таким образом, вы можете сбросить файл или искать до начала перед повторным чтением. Или, если он выполняет вашу задачу, вы можете использовать read(n)
для использования только n
байтов.
Google на "экспоненциальное представление regexp" шоу много соответствий, включая этот ( не используют его!!!! ), который использует
*** warning: questionable ***
/[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/
, который включает случаи, такие как-.5e7 и +00000e33 (оба из которых Вы не можете хотеть позволять).
Вместо этого я был бы высоко , рекомендуют использовать синтаксис на Doug Crockford веб-сайт JSON , который явно документы, что составляет число в JSON. Вот соответствующая схема синтаксиса, взятая от той страницы:
(источник: json.org )
при рассмотрении строки 456 из его сценарий json2.js (безопасное преобразование в JSON в JavaScript) Вы будете видеть эту часть regexp:
/-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/
, который по иронии судьбы не соответствует его схеме синтаксиса.... (похож, я должен зарегистрировать ошибку), я верю regexp, который действительно реализует ту схему синтаксиса, этот:
/-?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/
и если Вы хотите позволить начальную букву + также, Вы добираетесь:
/[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/
Добавляют круглые скобки получения к Вашей симпатии.
я также настоятельно рекомендовал бы, чтобы Вы изложили в деталях набор тестовых сценариев, чтобы гарантировать, чтобы Вы включали те возможности, которые Вы хотите включать (или не включать), такие как:
allowed:
+3
3.2e23
-4.70e+9
-.2E-4
-7.6603
not allowed:
+0003 (leading zeros)
37.e88 (dot before the e)
Удачи!
Вот некоторый код Perl, который я просто взломал вместе быстро.
my($sign,$coeffl,$coeffr,$exp) = $str =~ /^\s*([-+])?(\d+)(\.\d*)?e([-+]?\d+)\s*$/;
my $shift = length $coeffl;
$shift = 0 if $shift == 1;
my $coeff =
substr( $coeffl, 0, 1 );
if( $shift || $coeffr ){
$coeff .=
'.'.
substr( $coeffl, 1 );
}
$coeff .= substr( $coeffr, 1 ) if $coeffr;
$coeff = $sign . $coeff if $sign;
$exp += $shift;
say "coeff: $coeff exponent: $exp";