正则表达式匹配Android包名称

时间:2016-11-23 18:45:05

标签: android regex

如何检查String是否是有效的Android程序包名称?

5 个答案:

答案 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 *参见上文

  

+

量化器匹配一次到无限次,并尽可能多地匹配

  

$

在行尾声明位置

https://regex101.com/

答案 2 :(得分:0)

从android开发文档中,应用程序ID的命名规则为:

  • 它必须至少具有两个段(一个或多个点)。
  • 每个段都必须以字母开头。
  • 所有字符必须为字母数字或下划线[a-zA-Z0-9 _]。

以下是这些规则的正则表达式:

  

/ ^ [a-z] [a-z0-9 _] (。[a-z] [a-z0-9 _] )+ $ / i

答案 3 :(得分:0)

我使用了这个正则表达式并测试依赖于android应用程序id的官方文档

<块引用>
  • 它必须至少有两个部分(一个或多个点)。每段
  • 必须以字母开头。所有字符都必须是字母数字或
  • 下划线 [a-zA-Z0-9_]。
String regex = "^(?:[a-zA-Z]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-zA-Z]+(?:\d*[a-zA-Z_]*)*)+$" ;

答案 4 :(得分:0)

https://github.com/JetBrains/android/blob/7545bd83b798aebabef687a6be2fc763800d8d94/android/src/org/jetbrains/android/util/AndroidUtils.java#L727

以下代码不检查 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";
  }