如何检查String是否是有效的Android程序包名称?
答案 0 :(得分:7)
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
答案 1 :(得分:1)
不再使用@skeeve的注释,可以使用\ w代替[a-z0-9 _]
完整正则表达式:
/ ^ [a-z] \ w *(\。[a-z] \ w *)+ $ / i
说明:
i
不区分大小写的全局模式标志(忽略[a-zA-Z]的大小写)
^
在行首声明位置
[a-z]
匹配(索引97)和z(索引122)之间的单个字符(不区分大小写)
\ w *
\ w匹配任何单词字符(等于[a-zA-Z0-9 _])
*量词在零到无限次之间匹配,并尽可能多地匹配
(。[a-z] \ w *)+
括号定义一个组
\。
匹配字符。从字面上看(不区分大小写)
[a-z]参见上文
\ w *参见上文
+
量化器匹配一次到无限次,并尽可能多地匹配
$
在行尾声明位置
答案 2 :(得分:0)
从android开发文档中,应用程序ID的命名规则为:
以下是这些规则的正则表达式:
/ ^ [a-z] [a-z0-9 _] (。[a-z] [a-z0-9 _] )+ $ / i
答案 3 :(得分:0)
我使用了这个正则表达式并测试依赖于android应用程序id的官方文档
<块引用>String regex = "^(?:[a-zA-Z]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-zA-Z]+(?:\d*[a-zA-Z_]*)*)+$" ;
答案 4 :(得分:0)
以下代码不检查 pkg 名称中不允许的 java 关键字 例如break.app <<无效的包名称
查看上面的链接以获取完整代码
// 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";
}