Java String-如何在android中获取软件包名称的一部分?

时间:2015-04-14 23:41:30

标签: java android string

它主要是关于在两个字符之间获取字符串值。因此有很多与此相关的问题。像:

How to get a part of a string in java?

How to get a string between two characters?

Extract string between two strings in java

等等。 但是当我处理字符串中的多个点并获得某两个点之间的值时,我觉得它很安静。

我的包名是:

au.com.newline.myact

我需要获得" com。"之间的价值。和下一个"点(。)"。在这种情况下"换行"。我试过了

Pattern pattern = Pattern.compile("com.(.*).");
Matcher matcher = pattern.matcher(beforeTask);
while (matcher.find()) {
        int ct = matcher.group();

我也试过使用子串和IndexOf。但无法得到预期的答案。因为android中的包名称因点数和字符数不同而不同,所以我不能使用固定索引。请提出任何想法。

5 个答案:

答案 0 :(得分:2)

您所要做的就是将字符串拆分为“。”然后迭代它们直到找到一个等于“com”的东西。数组中的下一个字符串将是您想要的。

所以你的代码看起来像:

String[] parts = packageName.split("\\.");
int i = 0;
for(String part : parts) {
    if(part.equals("com")
        break;
    }
    ++i;
}
String result = parts[i+1];

答案 1 :(得分:2)

您可以使用反射来获取任何类的名称。例如:

如果我在Runner中有一个班级com.some.package,我可以运行

Runner.class.toString() // string is "com.some.package.Runner"

获取恰好在其中包含包名的类的全名。

在' com'之后得到一些东西。您可以使用Runner.class.toString().split(".")然后使用布尔标志

迭代返回的数组

答案 2 :(得分:2)

您可能知道(基于正则表达式中的.*部分)dot .是表示任何字符(行分隔符除外)的正则表达式中的特殊字符。因此,实际上使点代表只需要点的点,你需要逃避它。为此,您可以在其前面放置\,或将其放在character class [.]内。

另外,要仅从括号(.*)获取部分内容,您需要使用适当的group索引选择它,在您的情况下为1

请尝试使用

String beforeTask = "au.com.newline.myact";
Pattern pattern = Pattern.compile("com[.](.*)[.]");
Matcher matcher = pattern.matcher(beforeTask);
while (matcher.find()) {
     String ct = matcher.group(1);//remember that regex finds Strings, not int
     System.out.println(ct);
}

输出:newline


如果您希望在下一个.之前只获得一个元素,则需要通过添加{*.* ?中的Pattern pattern = Pattern.compile("com[.](.*?)[.]"); // ^ 量词更改为greedy behaviour {1}}之后

.*

另一种方法是[^.]*仅接受非点字符。它们可以由reluctant代表:Pattern pattern = Pattern.compile("com[.]([^.]*)[.]");

indexOf

如果您不想使用正则表达式,则只需使用com.方法查找.及其后String beforeTask = "au.com.newline.myact.modelact"; int start = beforeTask.indexOf("com.") + 4; // +4 since we also want to skip 'com.' part int end = beforeTask.indexOf(".", start); //find next `.` after start index String resutl = beforeTask.substring(start, end); System.out.println(resutl); 的位置即可。然后你可以简单地对你想要的东西进行子串。

{{1}}

答案 3 :(得分:1)

private String getStringAfterComDot(String packageName) {
        String strArr[] = packageName.split("\\.");
        for(int i=0; i<strArr.length; i++){
            if(strArr[i].equals("com"))
                return strArr[i+1];
        }
        return "";
    }

答案 4 :(得分:1)

在处理网站抓取和我之前,我已经完成了很多项目 只需创建自己的函数/ utils即可完成工作。正则表达式可能 如果你只想从中提取子字符串,那么有时候会有些过分 给定的字符串就像你拥有的字符串一样。以下是我通常的功能 用来做这种任务。

private String GetValueFromText(String sText, String sBefore, String sAfter)
{      
  String sRetValue = "";
  int nPos = sText.indexOf(sBefore);
  if ( nPos > -1 )
  {
    int nLast = sText.indexOf(sAfter,nPos+sBefore.length()+1);
    if ( nLast > -1)
    {
      sRetValue = sText.substring(nPos+sBefore.length(),nLast);
    }
  }
  return sRetValue;
}

要使用它,只需执行以下操作:

String sValue = GetValueFromText("au.com.newline.myact", ".com.", ".");