Я бы не пытался переоптимизировать такой шаблон и просто конвертировать каждый целочисленный литеральный тип и возможные суффиксы буквально в регулярное выражение с чередованием:
(?i)(?:0x(?:[0-9a-f]+(?:'?[0-9a-f]+)*)|0b(?:[10]+(?:'?[10]+)*)|\d+(?:'?\d+)*)(?:ull|ll|ul|l|u)?
Только разделители цифр требуют дополнительной работы: за разделителем не может следовать другой разделитель, и он может появляться только между числами.
Суффиксы разрешены как для шестнадцатеричного, так и для двоичного кода, как проверено на C ++ 14 здесь .
Демо
Примечание: шаблон разработан с учетом регистра.
Запустите его так: egrep -ei "(?:0x(?:[0-9a-f]+(?:'?[0-9a-f]+)*)|0b(?:[10]+(?:'?[10]+)*)|\d+(?:'?\d+)*)(?:ull|ll|ul|l|u)?" input.txt
PS: Если вы просто хотите извлечь значения, скрипт Perl может пригодиться:
use strict;
my $file = '/some/where/input.txt';
my $regex = qr/(?:0x(?:[0-9a-f]+(?:'?[0-9a-f]+)*)|0b(?:[10]+(?:'?[10]+)*)|\d+(?:'?\d+)*)(?:ull|ll|ul|l|u)?/ip;
open my $input, '<', $file or die "can't open $file: $!";
while (<$input>) {
chomp;
while ($_ =~ /($regex)/g) {
print "${^MATCH}\n";
}
}
close $input or die "can't close $file: $!";