RegEx: найти все совпадения во всей строке [duplicate]

Математическая математика с плавающей запятой такова. В большинстве языков программирования он основан на стандарте IEEE 754 . JavaScript использует 64-битное представление с плавающей запятой, которое совпадает с Java double. Суть проблемы состоит в том, что числа представлены в этом формате как целое число раз в два раза; рациональные числа (такие как 0.1, который является 1/10), знаменатель которого не является степенью двух, не могут быть точно представлены.

Для 0.1 в стандартном формате binary64 представление может записывается в точности как

  • 0.1000000000000000055511151231257827021181583404541015625 в десятичной форме или
  • 0x1.999999999999ap-4 в нотации C99 hexfloat .

Напротив, рациональное число 0.1, которое является 1/10, может быть записано точно как

  • 0.1 в десятичной форме или
  • 0x1.99999999999999...p-4 в аналоге обозначения гексафлоата C99, где ... представляет собой бесконечную последовательность 9.

Константы 0.2 и 0.3 в вашей программе также будут приближенными к их истинные ценности. Бывает, что ближайший double до 0.2 больше, чем рациональное число 0.2, но ближайший double до 0.3 меньше, чем рациональное число 0.3. Сумма 0.1 и 0.2 заканчивается выше, чем рациональное число 0.3 и, следовательно, не согласуется с константой в вашем коде.

Достаточно полное рассмотрение арифметических вопросов с плавающей запятой Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой . Для более простого объяснения см. floating-point-gui.de .

5
задан john Smith 17 February 2016 в 14:34
поделиться

1 ответ

Общей трюкой является использование техники захвата внутри неизведанного позитивного взгляда. Используйте это регулярное выражение с preg_match_all:

(?=(1....1))

См. regex demo

Значения находятся в $matches[1] :

$re = "/(?=(1....1))/"; 
$str = "001110000100001100001"; 
preg_match_all($re, $str, $matches);
print_r($matches[1]);

См. ссылку lookahead :

Lookaround фактически соответствует символам, но затем отбрасывает совпадение, возвращая только результат: совпадение или не совпадает. Вот почему их называют «утверждениями». Они не потребляют символы в строке, а только утверждают, возможно ли совпадение.

Если вы хотите сохранить совпадение регулярного выражения внутри lookahead, вам нужно поместить скобки для скобок вокруг регулярного выражения внутри lookahead, вот так: (?=(regex)).

5
ответ дан Wiktor Stribiżew 27 August 2018 в 22:29
поделиться
Другие вопросы по тегам:

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