我想使用egrep / grep -E打印出包含整数文字的C源文件中的行(如here所述)。以下内容大部分都有效,但它也匹配浮点数:
egrep '\b[0-9]+' *.c
有关如何解决此问题的任何建议吗?
答案 0 :(得分:1)
您可以使用否定外观来确保数字不是后面的 .
:
\b(?<!\.)[0-9]+(?!\.)\b
修改强>
由于您只想在评论中提到的十六进制文字中0
0x
匹配,请改用以下模式。它与原始正则表达式完全相同,只是它不匹配浮点数。
\b(?<!\.)[0-9]+(?![\.\d])
答案 1 :(得分:0)
我不会尝试过度优化这样的模式,只是将每个整数文字类型和可能的后缀字面转换为带有替换的正则表达式:
egrep -ei "(?:0x(?:[0-9a-f]+(?:'?[0-9a-f]+)*)|0b(?:[10]+(?:'?[10]+)*)|\d+(?:'?\d+)*)(?:ull|ll|ul|l|u)?" input.txt
只有数字分隔符需要更多工作:分隔符不能跟随另一个分隔符,只能出现在数字之间。
使用C ++ 14 here测试后缀也允许使用十六进制和二进制。
注意:该模式设计为不区分大小写。
运行方式如下: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: $!";
PS:如果您只想提取值,Perl脚本可以派上用场:
CGRect shadowRect = CGRectInset(someView.bounds, 0, 4); // inset top/bottom
someView.layer.shadowPath = [[UIBezierPath bezierPathWithRect:shadowRect] CGPath];