Парсинг экспоненциального представления разумно?

read() потребляет. Таким образом, вы можете сбросить файл или искать до начала перед повторным чтением. Или, если он выполняет вашу задачу, вы можете использовать read(n) для использования только n байтов.

41
задан Chad Birch 3 April 2009 в 22:14
поделиться

2 ответа

Google на "экспоненциальное представление regexp" шоу много соответствий, включая этот ( не используют его!!!! ), который использует

*** warning: questionable ***
/[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/

, который включает случаи, такие как-.5e7 и +00000e33 (оба из которых Вы не можете хотеть позволять).

Вместо этого я был бы высоко , рекомендуют использовать синтаксис на Doug Crockford веб-сайт JSON , который явно документы, что составляет число в JSON. Вот соответствующая схема синтаксиса, взятая от той страницы:

alt text
(источник: 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)

Удачи!

74
ответ дан Glorfindel 12 November 2019 в 11:18
поделиться

Вот некоторый код 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";
1
ответ дан Brad Gilbert 12 November 2019 в 11:18
поделиться
Другие вопросы по тегам:

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