如何检查一个字符串是否是合法的Android包名?
AndroidManifest文档中对包属性描述了有效的Android软件包名称:
名称应该是唯一的。名称可以包含大写或小写字母('A'到'Z'),数字和下划线('_')。但是,单个包名称部分只能以字母开头。
参见: https://developer.android.com/guide/topics/manifest/manifest-element.html#package
以下正则表达式将匹配一个有效的Android软件包名称:
^([A-Za-z]{1}[A-Za-z\d_]*\.)+[A-Za-z][A-Za-z\d_]*$
示例用法:
String regex = "^([A-Za-z]{1}[A-Za-z\\d_]*\\.)+[A-Za-z][A-Za-z\\d_]*$";
List<PackageInfo> packages = context.getPackageManager().getInstalledPackages(0);
for (PackageInfo packageInfo : packages) {
if (packageInfo.packageName.matches(regex)) {
// valid package name, of course.
}
}
有关正则表达式的详细解释,请参见:https://regex101.com/r/EAod0W/1
解释:/^[a-z]\w*(\.[a-z]\w*)+$/i
全局模式标记,用于不区分大小写(忽略 [a-zA-Z] 的大小写)。i
在一行开头确定位置:^
匹配一个单个字符,范围在a(索引97)和z(索引122)之间(不区分大小写)[a-z]
\w匹配任何单词字符(等同于[a-zA-Z0-9_])\w*
括号定义一个组(.[a-z]\w*)+
量词匹配一次到无限次,尽可能多地匹配。+
在一行的末尾添加位置。$
- 它必须至少有两个部分(一个或多个点)。每个部分必须以字母开头。所有字符必须是字母数字或者下划线 [a-zA-Z0-9_]。
String regex = "^(?:[a-zA-Z]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-zA-Z]+(?:\d*[a-zA-Z_]*)*)+$" ;
com.aliucord.guhhhhhhhhhhfhuhhhhhhhhhhhhhhhh4343hh$
- Diamond从Android开发文档中,应用程序ID的命名规则如下:
这是这些规则的正则表达式:
/^[a-z][a-z0-9_](.[a-z][a-z0-9_])+$/i
// This method is a copy of android.content.pm.PackageParser#validateName with the
// error messages tweaked
//Returns null if valid package name
@Nullable
private static String validateName(String name) {
final int N = name.length();
boolean hasSep = false;
boolean front = true;
for (int i=0; i<N; i++) {
final char c = name.charAt(i);
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
front = false;
continue;
}
if ((c >= '0' && c <= '9') || c == '_') {
if (!front) {
continue;
} else {
if (c == '_') {
return "The character '_' cannot be the first character in a package segment";
} else {
return "A digit cannot be the first character in a package segment";
}
}
}
if (c == '.') {
hasSep = true;
front = true;
continue;
}
return "The character '" + c + "' is not allowed in Android application package names";
}
return hasSep ? null : "The package must have at least one '.' separator";
}
Åęø.ßlah
。 - OneCricketeer