Regexp检查代码是否包含非UTF-8字符?

use*_*582 8 java regex utf-8 sonarqube

我在Sonar使用PMD,checkstyle,findbugs等.我想有一条规则验证Java代码不包含不属于UTF-8的字符.

例如,不应该允许角色

我在上面的插件中找不到这个规则,但我想可以在Sonar中制作自定义规则.

ksh*_*erd 10

这是正则表达式,它只匹配有效的UTF-8字节序列:

/^([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|[\xEE-\xEF][\x80-\xBF]{2}|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/
Run Code Online (Sandbox Code Playgroud)

我从RFC 3629 UTF-8中获得了它,这是ISO 10646第4节的转换格式 - UTF-8字节序列的语法.

对上述因素进行分解会略微缩短:

/^([\x00-\x7F]|([\xC2-\xDF]|\xE0[\xA0-\xBF]|\xED[\x80-\x9F]|(|[\xE1-\xEC]|[\xEE-\xEF]|\xF0[\x90-\xBF]|\xF4[\x80-\x8F]|[\xF1-\xF3][\x80-\xBF])[\x80-\xBF])[\x80-\xBF])*$/
Run Code Online (Sandbox Code Playgroud)

这个简单的perl脚本演示了用法:

#!/usr/bin/perl -w
my $passstring = "This string \xEF\xBF\xBD == ? is valid UTF-8";
my $failstring = "This string \x{FFFD} == ? is not valid UTF-8";
if ($passstring =~ /^([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|[\xEE-\xEF][\x80-\xBF]{2}|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/)
    {
    print 'Passstring passed'."\n";
    }
else
    {
    print 'Passstring did not pass'."\n";
    }
if ($failstring =~ /^([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|[\xEE-\xEF][\x80-\xBF]{2}|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/)
    {
    print 'Failstring passed'."\n";
    }
else
    {
    print 'Failstring did not pass'."\n";
    }
exit;
Run Code Online (Sandbox Code Playgroud)

它产生以下输出:

Passstring passed
Failstring did not pass
Run Code Online (Sandbox Code Playgroud)