Регулярное выражение для соответствия целым литералам C - PullRequest
0 голосов
/ 17 мая 2018

Я хотел бы использовать egrep / grep -E для распечатки строк в исходных файлах C, которые содержат целочисленные литералы (как описано здесь ). Следующее работает по большей части, за исключением того, что оно совпадает и с плавающей точкой:

egrep '\b[0-9]+' *.c

Есть предложения, как это исправить?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Я бы не пытался переоптимизировать такой шаблон и просто конвертировать каждый целочисленный литеральный тип и возможные суффиксы буквально в регулярное выражение с чередованием:

(?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: $!";
0 голосов
/ 17 мая 2018

Вы можете использовать отрицательные Lookarounds, чтобы убедиться, что за номером не следует или перед a .:

\b(?<!\.)[0-9]+(?!\.)\b

Редактировать:

Поскольку вы хотите совпадать с 0 из 0x в шестнадцатеричных литералах, как вы упоминали в комментариях, используйте вместо этого следующий шаблон.Он работает точно так же, как ваше оригинальное регулярное выражение, за исключением того, что он не совпадает с числами с плавающей точкой.

\b(?<!\.)[0-9]+(?![\.\d])

Попробуйте онлайн .

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...