Два броска C-стиля в Вашем примере являются различными видами броска. В C++ Вы обычно писали бы им
unsigned int uf1 = static_cast<unsigned int>(fl);
и
unsigned char* up = reinterpret_cast<unsigned char*>(p);
, первое выполняет арифметический бросок, который усекает число с плавающей точкой, таким образом, существует потеря данных.
второе не вносит изменений в данные - они просто дают компилятору команду рассматривать указатель как другой тип. Необходимо соблюдать осторожность об этом виде броска: это может быть очень опасно.
/.._...._[0-9][0-9][0-9][0-9][0-9][0-9](?:[A-Z][A-Z])?/
Вы также можете использовать {}, чтобы сделать регулярное выражение короче:
/.{2}_.{4}_[0-9]{6}(?:[A-Z]{2})?/
Объяснение: ?
делает предыдущий шаблон необязательным. ()
группирует выражения вместе (так что Ruby знает, что ?
применяется к двум буквам). ?:
после открытия (
делает группу не захватывающей (захватываемые группы изменяют значения, полученные при сканировании).
Почему бы просто не использовать разделение?
"AB_ABCD_123456".split(/_/).join(',')
Обработка перечисленных вами случаев без изменений.
Попробуйте следующее:
text.scan(/\w{2}_\w{4}_\d{6}\w{0,2}/)
#matches AB_ABCD_123456UK or ab_abcd_123456uk and so on...
или
text.scan(/[A-Z]{2}_[A-Z]{4}_\d{6}[A-Z]{0,2}/)
# tighter, matches only AB_ABCD_123456UK and similars...
# and not something like ab_aBCd_123456UK or ab_abcd_123456uk and similars...
обратитесь к этим URL:
Ruby модификаторы gsub / regex?
http://ruby-doc.org/docs/ruby -doc-bundle / Manual / man-1.4 / syntax.html # regexp
, если вы хотите узнать больше о регулярных выражениях.